Невозможно перехватить нажатия клавиш в приложении службы Windows на C#C#

Место общения программистов C#
Anonymous
Невозможно перехватить нажатия клавиш в приложении службы Windows на C#

Сообщение Anonymous »

Описание:
Я разрабатываю приложение службы Windows на C# с целью захвата нажатий клавиш с помощью низкоуровневых перехватчиков клавиатуры. В предоставленном фрагменте кода описана моя реализация, но я столкнулся с проблемой, из-за которой метод HookCallback, отвечающий за обработку событий перехвата клавиатуры и запись нажатых клавиш в файл, похоже, не вызывается.
Вот разбивка кода:
Настройка перехватчика:
The SetHook метод отвечает за настройку низкоуровневого перехвата клавиатуры с помощью функции SetWindowsHookEx.
Он пытается установить перехватчик с помощью WH_KEYBOARD_LL (что указывает на низкоуровневый перехват клавиатуры) и определяет метод обратного вызова. (HookCallback) для обработки событий перехвата.
Обратный вызов:
Метод HookCallback предназначен для вызова всякий раз, когда происходит событие клавиатуры.
Он проверяет, указывает ли код события (nCode) на событие нажатия клавиши (WM_KEYDOWN), и продолжает записывать нажатую клавишу в файл с помощью метода LogToFile.
/>Журналирование:
Метод LogToFile отвечает за запись сообщений в файл журнала (C:\Logs\KeyStrokes.log).
Он создает файл журнала, если он не существует, и добавляет к нему предоставленное сообщение.
Несмотря на успешную настройку перехватчика и проверку работы службы, нажатия клавиш не фиксируются и не записываются в файл, как ожидалось. Я проверил, что файл создается, но он пишет до метода setHook.
Я тщательно проверил реализацию, обеспечил соответствующие разрешения и подтвердил, что сигнатура метода обратного вызова соответствует ожидаемый формат для обратных вызовов перехвата. Однако я не могу понять, почему метод HookCallback не вызывается при нажатии клавиш.
фрагмент кода: -

Код: Выделить всё

using System;
using System.Runtime.InteropServices;
using System.ServiceProcess;
using System.Diagnostics;

namespace KeyStrokes
{
public partial class KeyStrokesService : ServiceBase
{
private const int WH_KEYBOARD_LL = 13;
private const int WM_KEYDOWN = 0x0100;

private delegate IntPtr LowLevelKeyboardProc(int nCode,
IntPtr wParam, IntPtr lParam);

private LowLevelKeyboardProc _proc;
private IntPtr _hookID = IntPtr.Zero;

[DllImport("user32.dll", CharSet = CharSet.Auto,
SetLastError = true)]
private static extern IntPtr SetWindowsHookEx(int idHook,
LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);

[DllImport("user32.dll", CharSet = CharSet.Auto,
SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool UnhookWindowsHookEx(IntPtr hhk);

[DllImport("user32.dll", CharSet = CharSet.Auto,
SetLastError = true)]
private static extern IntPtr CallNextHookEx(IntPtr hhk, int
nCode, IntPtr wParam, IntPtr lParam);

[DllImport("kernel32.dll", CharSet = CharSet.Auto,
SetLastError = true)]
private static extern IntPtr GetModuleHandle(string
lpModuleName);

public KeyStrokesService()
{
InitializeComponent();
}

protected override void OnStart(string[] args)
{
_proc = HookCallback;
_hookID = SetHook(_proc);
}

protected override void OnStop()
{
UnhookWindowsHookEx(_hookID);
}

private IntPtr SetHook(LowLevelKeyboardProc proc)
{
using (Process process = Process.GetCurrentProcess())
using (ProcessModule module = process.MainModule)
{
return SetWindowsHookEx(WH_KEYBOARD_LL, proc,
GetModuleHandle(module.ModuleName), 0);
}
}

private IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr
lParam)
{
if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
{
int vkCode = Marshal.ReadInt32(lParam);
char keyChar = (char)vkCode;

// Log the pressed key (you can replace this with
your desired action)
Console.WriteLine("Key pressed: " + keyChar);
}

return CallNextHookEx(_hookID, nCode, wParam, lParam);
}
}
}
Мне нужны рекомендации по устранению этой проблемы и любые сведения о том, почему обратный вызов перехватчика может не запускаться должным образом.
Будем очень признательны за любую помощь или предложения. Спасибо!

Подробнее здесь: https://stackoverflow.com/questions/782 ... in-c-sharp

Вернуться в «C#»