Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将钩子添加到键盘(HookProc)_C++_Windows_Hook - Fatal编程技术网

C++ 如何将钩子添加到键盘(HookProc)

C++ 如何将钩子添加到键盘(HookProc),c++,windows,hook,C++,Windows,Hook,我试着做一个简单的keylog测试,但是我的程序没有按预期工作,我不知道为什么 在我的程序中,我有一个低级键盘挂钩,并附加了一个简单的过程。该过程只是打开/创建一个文件并写入Hello World,然后关闭。但是它没有创建文件,可能是因为我的进程不正确,或者因为我的钩子没有正确建立 代码: 有两种挂钩: 全局钩子 全局钩子过程应该放在一个单独的DLL中,然后在主进程中加载钩子DLL及其钩子过程并设置钩子 一个全局钩子监视同一桌面上所有线程的消息 调用线程。特定于线程的钩子只监视消息 一根单独的线

我试着做一个简单的keylog测试,但是我的程序没有按预期工作,我不知道为什么

在我的程序中,我有一个低级键盘挂钩,并附加了一个简单的过程。该过程只是打开/创建一个文件并写入Hello World,然后关闭。但是它没有创建文件,可能是因为我的进程不正确,或者因为我的钩子没有正确建立

代码:


有两种挂钩:

全局钩子 全局钩子过程应该放在一个单独的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您很可能遇到了问题,因为您上面发布的解决方案有很大的内存问题!看看我上面的评论。