[英]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.