繁体   English   中英

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

[英]Global Hook in c++ doesn't work?

试图写一个全球CBT钩,
这是我的代码,但是我的挂钩应用程序未收到任何消息,也没有将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);
   }
}

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

请参阅GetProp和SetProp。

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

总体结构听起来不错。

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

我将CBTProc删除,以便您仅在每个minmax上暂时登录到文件,这将使您看到dll已被正确注入。

WM_USER可以在单个应用程序中使用,而不能跨应用程序使用(尽管您可以摆脱它)。 考虑RegisterWindowMessage()

如果注入的应用程序是较低的priv级别,则可能需要强制您的接收应用程序使用ChangeWindowMessageFilter允许较低权限的应用程序与您联系

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

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

在indllmain中,您可以使用outputdebug来记录dll被加载到哪些应用程序中

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM