Я пишу быстрый инструмент на C #, предназначенный для виртуальной клавиатуры. На данный момент я использую SendKeys. Я хочу знать, будут ли клавиатурные шпионы захватывать ключи, поэтому я нашел этот код но у меня не установлен MFC, поэтому я не могу скомпилировать или запустить его
Как я могу набрать ключ, если SendKeys регистрируется кейлоггерами или как получить код (фрагмент ниже), запущенный в одном exe-файле для тестирования моего кода?
#include <Windows.h>
static UINT uMsg = 0;
static HWND hWndMain = 0;
static HHOOK hKeyHook = NULL ;
#pragma data_seg()
HINSTANCE hInstance = 0;
HOOKPROC lpfnHookProc = 0;
LRESULT __stdcall KeyboardFunc (int nCode, WPARAM wParam, LPARAM lParam)
{
BOOL bPassToChain;
char szDebug [100];
// Check for exception cases...
if (nCode < 0)
return (CallNextHookEx (hKeyHook, nCode, wParam, lParam));
if (nCode == HC_NOREMOVE)
return (CallNextHookEx (hKeyHook, nCode, wParam, lParam));
switch (wParam)
{
case VK_F2:
wsprintf (szDebug, "F2 key message, lparam = 0x%X\n", lParam);
OutputDebugString (szDebug);
// only send on keydown, not keyup (autorepeat)
if (HIWORD (lParam) & 0xC000)
{
OutputDebugString ("F2 Keyup\n");
}
else
{
wsprintf (szDebug, "Sending F2 keydown message %d to hwnd 0x%X\n",
uMsg, hWndMain);
OutputDebugString (szDebug);
PostMessage (hWndMain, uMsg, 0, 0);
}
bPassToChain = FALSE;
break;
default :
bPassToChain = TRUE ;
break ;
}
if (bPassToChain)
return (CallNextHookEx (hKeyHook, nCode, wParam, lParam));
else
return TRUE ; // We have processed this key
}
BOOL __stdcall InstallExampleKeyboardHook (HWND hWnd, UINT uMyMsg)
{
hWndMain = hWnd ;
uMsg = uMyMsg;
lpfnHookProc = (HOOKPROC) KeyboardFunc ;
hKeyHook = SetWindowsHookEx (WH_KEYBOARD, lpfnHookProc, hInstance, NULL);
if (hKeyHook)
return TRUE ;
else
return FALSE ;
}
Это ничего не про MFC. Прямой нативный код на C ++. Если у вас есть Visual Studio, вы сможете быстро создать консольное приложение c ++, скопировать и вставить этот код, а также скомпилировать и протестировать. Если нет, то получите бесплатный, но большой Windows SDK. Менее дружественный, чем VS, но есть компилятор, поэтому он должен направить вас в правильном направлении.
Низкоуровневые хуки не совсем удобны для отладчика, поэтому вам может потребоваться отследить или выйти из системы некоторых полезных утверждений.
Отредактировано: чтобы получить дескриптор модуля, вам понадобится что-то вроде этого:
HookModule = LoadLibrary(ModulePath);
HookProc HookFunction = GetProcAddress(HookModule, "GetMessageCallBack");
GetMessageHookHandle = SetWindowsHookEx(HookType.WH_GETMESSAGE, HookFunction, HookModule, 0);
Других решений пока нет …