C ++中的Global Hook不起作用?

时间:2010-08-06 11:51:13

标签: c++ dll

尝试编写GLOBAL CBT HOOK,
这是我的代码,但是我的挂钩应用程序没有收到任何消息,也没有将dll写入测试文件。

这是我的代码:

#include "stdafx.h"

#include "GlobalHook.h"


#include "Stdafx.h"

#include <iostream>
#include <fstream>

#define DLL_EXPORT
#include "GlobalHook.h"
#include <windows.h>
using namespace std;

#pragma comment(lib, "User32.lib")
#pragma unmanaged

HINSTANCE dllHandle;  
#pragma data_seg("ASEG")  
    HWND prnt = 0;  
#pragma data_seg()  
#pragma comment(linker, "/section:ASEG,RWS")  
    HHOOK hHook;  
    int x = 0;  

BOOL APIENTRY DllMain(    
         HINSTANCE hinstDLL,  // handle to DLL module  
         DWORD fdwReason,     // reason for calling function  
         PVOID lpReserved )  // reserved  
{
    // Perform actions based on the reason for calling.  
    switch( fdwReason )  
    {  
    case DLL_PROCESS_ATTACH:    
        dllHandle = hinstDLL;    
        return TRUE;  
        break;  
    }  
}  
   LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM lParam)  
   {
        if(nCode < 0)
        {
            return CallNextHookEx(hHook, nCode, wParam, lParam);
        }
        if(nCode == HCBT_MINMAX)
        {
            SendNotifyMessage(prnt, WM_USER + 3, wParam, lParam);
            if(x == 0)
            {
                ofstream myfile;
                myfile.open ("C:\\example.txt");
                myfile << "Dies in ein File.";
                myfile.close();
                x = 1;
            }
        }
        return CallNextHookEx(hHook, nCode, wParam, lParam);
   }
extern "C"
{
   DECLDIR int SetHook( HWND parent )
   {
       prnt = parent;
        hHook = SetWindowsHookEx(WH_CBT, CBTProc, dllHandle, 0);
        return 1;
   }
   DECLDIR void UninstallHook( void )
   {
      if(UnhookWindowsHookEx(hHook))
      {

      }
   }
   DECLDIR int Add(int a, int b)
   {
       return (a + b);
   }
}

2 个答案:

答案 0 :(得分:0)

使用全局钩子需要“注入DLL”。您的DLL将被注入到每个正在运行的进程中(使用UI线程)。注入DLL时,模块中的任何全局变量都将为NULL / 0。您必须缓存要在全局可访问区域中发送消息的窗口句柄。最简单的地方是使用桌面窗口属性。

请参阅GetProp和SetProp。

请注意,如果您希望全局挂钩在64位Windows上运行,则需要同时具有32位和64位注入DLL以及32位和64位注入器应用程序。否则,您只会挂钩与注入器/ DLL具有相同位数的应用程序。

答案 1 :(得分:0)

一般结构似乎很合理。

#pragma comment(linker, "/section:ASEG,RWS") RWS可能需要成为rws

我会删除CBTProc,这样你只需要在每个minmax上登录文件,这样你就可以看到你的dll已经正确注入了。

WM_USER是在单个应用程序中使用而不是跨应用程序(尽管你可以侥幸逃脱)。考虑RegisterWindowMessage()

如果注入的应用程序属于较低的私有级别,您可能需要强制您的接收应用程序允许使用ChangeWindowMessageFilter

从较低的私有应用程序进行联系

也可以尝试连接WH_CALLWNDPROC,WH_GETMESSAGE以查看是否可以通过其他消息。

您的窗口也会被挂钩,请确保您没有进入消息发送循环。 您正在使用SendMessage转发消息,它将导致应用程序的消息泵被阻止,如果该应用程序也是您自己处理您将锁定的消息。

indllmain你可以使用outputdebug来记录加载dll的应用程序