C++ 如何将钩子添加到键盘(HookProc)
我试着做一个简单的keylog测试,但是我的程序没有按预期工作,我不知道为什么 在我的程序中,我有一个低级键盘挂钩,并附加了一个简单的过程。该过程只是打开/创建一个文件并写入Hello World,然后关闭。但是它没有创建文件,可能是因为我的进程不正确,或者因为我的钩子没有正确建立 代码:C++ 如何将钩子添加到键盘(HookProc),c++,windows,hook,C++,Windows,Hook,我试着做一个简单的keylog测试,但是我的程序没有按预期工作,我不知道为什么 在我的程序中,我有一个低级键盘挂钩,并附加了一个简单的过程。该过程只是打开/创建一个文件并写入Hello World,然后关闭。但是它没有创建文件,可能是因为我的进程不正确,或者因为我的钩子没有正确建立 代码: 有两种挂钩: 全局钩子 全局钩子过程应该放在一个单独的DLL中,然后在主进程中加载钩子DLL及其钩子过程并设置钩子 一个全局钩子监视同一桌面上所有线程的消息 调用线程。特定于线程的钩子只监视消息 一根单独的线
有两种挂钩: 全局钩子 全局钩子过程应该放在一个单独的DLL中,然后在主进程中加载钩子DLL及其钩子过程并设置钩子 一个全局钩子监视同一桌面上所有线程的消息 调用线程。特定于线程的钩子只监视消息 一根单独的线。可以在中调用全局钩子过程 与调用线程位于同一桌面上的任何应用程序的上下文, 因此,该过程必须位于单独的DLL模块中 也就是说:KeyboardProc进入一个单独的DLL,例如myhookdll.DLL。 在您的过程中,您可以执行以下操作:
HOOKPROC hkprc;
static HINSTANCE hhookDLL ;
static HHOOK hhook ;
hhookDLL = LoadLibrary(TEXT("c:\\...\\myhookdll.dll"));
hkprc = (HOOKPROC)GetProcAddress(hhookDLL, "KeyboardProc");
hhook = SetWindowsHookEx(
WH_KEYBOARD,
hkprc,
hhookDLL,
0);
这里有一个很好的参考:
线程级钩子关于在线程级钩子的特定“WH\u-KEYBOARD\u-LL”,它不需要单独的DLL
特定于线程的
钩子过程仅在关联线程的上下文中调用。
如果应用程序为自己的一个应用程序安装了钩子过程
线程,钩子过程可以与
应用程序的其余代码或在DLL中。如果应用程序
为不同应用程序的线程安装钩子过程
过程必须在DLL中。有关信息,请参见动态链接
图书馆
但是线程级挂钩需要一个消息泵:
这个钩子是在安装它的线程的上下文中调用的。
调用是通过向安装
钩因此,安装挂钩的螺纹必须具有
消息循环
这里有一个基本的消息循环:
while((bRet = GetMessage(&msg, NULL, 0, 0)) != 0)
{
if(bRet == -1)
{
// Handle Error
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
有两种挂钩: 全局钩子 全局钩子过程应该放在一个单独的DLL中,然后在主进程中加载钩子DLL及其钩子过程并设置钩子 一个全局钩子监视同一桌面上所有线程的消息 调用线程。特定于线程的钩子只监视消息 一根单独的线。可以在中调用全局钩子过程 与调用线程位于同一桌面上的任何应用程序的上下文, 因此,该过程必须位于单独的DLL模块中 也就是说:KeyboardProc进入一个单独的DLL,例如myhookdll.DLL。 在您的过程中,您可以执行以下操作:
HOOKPROC hkprc;
static HINSTANCE hhookDLL ;
static HHOOK hhook ;
hhookDLL = LoadLibrary(TEXT("c:\\...\\myhookdll.dll"));
hkprc = (HOOKPROC)GetProcAddress(hhookDLL, "KeyboardProc");
hhook = SetWindowsHookEx(
WH_KEYBOARD,
hkprc,
hhookDLL,
0);
这里有一个很好的参考:
线程级钩子关于在线程级钩子的特定“WH\u-KEYBOARD\u-LL”,它不需要单独的DLL
特定于线程的
钩子过程仅在关联线程的上下文中调用。
如果应用程序为自己的一个应用程序安装了钩子过程
线程,钩子过程可以与
应用程序的其余代码或在DLL中。如果应用程序
为不同应用程序的线程安装钩子过程
过程必须在DLL中。有关信息,请参见动态链接
图书馆
但是线程级挂钩需要一个消息泵:
这个钩子是在安装它的线程的上下文中调用的。
调用是通过向安装
钩因此,安装挂钩的螺纹必须具有
消息循环
这里有一个基本的消息循环:
while((bRet = GetMessage(&msg, NULL, 0, 0)) != 0)
{
if(bRet == -1)
{
// Handle Error
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
检查调用SetWindowsHookEx的结果。引用自MSDN:如果函数失败,则返回值为NULL。要获取扩展的错误信息,请调用GetLastError。它不是null,我将更新代码,使其包含检查您的解决方案有大内存问题!您正在使用指向MSG的指针,但没有分配存储它的内存。你最好用:味精;并将其指针传递给每个函数,即&MsgCheck调用SetWindowsHookEx的结果。引用自MSDN:如果函数失败,则返回值为NULL。要获取扩展的错误信息,请调用GetLastError。它不是null,我将更新代码,使其包含检查您的解决方案有大内存问题!您正在使用指向MSG的指针,但没有分配存储它的内存。你最好用:味精;并将其指针传递给每个函数,即&MsgI正在处理此问题,试图使其适应我的代码,您知道如何在不手动关闭流程的情况下打破消息循环吗?我尝试将计数器放入while循环,但如果“GetMessage”检索WM_QUIT消息,返回值为零,循环退出,则计数器不起作用。对不起,可能我误解了您的问题GetMessage'是一种阻塞方法,即在收到消息之前不会返回。如果要在消息中使用计数器或超时
循环使用“PeekMessage”的确。嗯,无论哪种方式我都有麻烦。在消息循环中使用GetMessage和PostQuitMessage不会退出,而PeekMessage会立即退出,因为它首先读取WM_Quit您很可能遇到了问题,因为您上面发布的解决方案有很大的内存问题!看看我上面的评论。我正在处理这个问题,试图使它适应我的代码,你知道如何在不手动关闭流程的情况下打破消息循环吗?我尝试将计数器放入while循环,但如果“GetMessage”检索WM_QUIT消息,返回值为零,循环退出,则计数器不起作用。对不起,可能我误解了您的问题GetMessage'是一种阻塞方法,即在收到消息之前不会返回。如果您想在消息循环中使用计数器或超时,请确实使用“PeekMessage”。嗯,无论哪种方式,我都有麻烦。在消息循环中使用GetMessage和PostQuitMessage不会退出,而PeekMessage会立即退出,因为它首先读取WM_Quit您很可能遇到了问题,因为您上面发布的解决方案有很大的内存问题!看看我上面的评论。