我正在使用Windows Hooks创建一个键盘记录器。 代码在DLL中。键入的字符将写入文件。 但问题是,除了焦点在我的应用程序窗口上的字符之外,没有任何字符被记录到文件中。 FILE *已在共享内存段中声明。
#pragma data_seg("SHARED")
.
.
FILE* iFile = NULL;
#pragma data_seg()
如果我在钩子函数中打开文件,一切似乎都没问题。
EXPORT LRESULT CALLBACK KHookProc(int nCode, WPARAM wparam, LPARAM lparam)
{
.
.
.
iFile = fopen("c:\\games\\log.txt","a+");
fwrite((char *)(&c),1,1,iFile);
fclose(iFile);
}
}
如果我在设置挂钩时打开它(所有进程都通用),但是我的应用程序按键被捕获。
EXPORT void SetKBHook()
{
if(hhook==NULL)
{
hhook = SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KHookProc,g_hinstance,NULL);
if(hhook == NULL)
{
DWORD err = GetLastError();
err;
}
iFile = fopen("c:\\games\\log.txt","a+");
}
}
帮助。任何人吗?
答案 0 :(得分:0)
我不建议将FILE指针放在共享内存段中,而是建议钩子的每个实例使用命名的互斥锁分别写入文件,以确保它们不会互相破坏。如果你想得到想象(可能提高性能),你可以创建一个单独的日志记录过程,从钩子接收输入,除了写入文件之外什么都不做。
我忽略了你正在编写键盘记录器的脸,因为这实际上是关于多进程钩子的问题。请不要对键盘记录器做任何恶意。
答案 1 :(得分:0)
虽然指针变量可以在进程之间共享(如果你将正确的参数传递给链接器),既没有FILE *指向的堆分配数据结构,也没有底层的Win32文件句柄(以及相关的内核 - 模式文件对象)是共享的。
您最好将文件句柄打开一个进程(启动键盘记录程序),然后使用IPC机制将数据传输回此进程,然后处理(正确同步)写入。
这对于任何类型的合法键盘记录目的都可以正常工作,并且可以避免很多令人头疼的尝试将文件句柄共享到您自己未启动的进程中...更不用说同步蓝调如果您成功使用第一个任务。