关于Hook拦截不到WM_WM_KILLFOCUS消息。

ITDeng 2011-12-28 05:54:32
LRESULT CALLBACK GetMsgProc( int code, // hook code
WPARAM wParam, // current-process flag
LPARAM lParam // message data
)

SetWindowsHookEx(WH_GETMESSAGE,GetMsgProc,GetModuleHandle("HookDll"),NULL);

现在钩子可以设置成功,也进入了GetMsgProc函数。,但就是拦截不到指定的消息,
大概就是这些,具体代码如下:

dll def文件:
LIBRARY HookDll
EXPORTS
SetHook




dll cpp文件:
#include <windows.h>
#pragma data_seg("MyHookEx")
HHOOK hhgm=NULL;
#pragma data_seg()

#pragma comment(linker,"/section:MyHookEx,RWS")
LRESULT CALLBACK GetMsgProc( int code, // hook code
WPARAM wParam, // current-process flag
LPARAM lParam // message data
)
{
if(code==HC_ACTION)
{
MSG *msg = (MSG*)lParam;
if(code == HCBT_ACTIVATE)
{
if(msg->message==WM_KILLFOCUS)
{
MessageBox(0,0,0,0);
}
}
return 0;
}else if(code<0)
{
return CallNextHookEx(hhgm,code,wParam,lParam);
}
return 0;
}
void SetHook()
{
hhgm = SetWindowsHookEx(WH_GETMESSAGE,GetMsgProc,GetModuleHandle("HookDll"),NULL);
if(hhgm)
{
MessageBox(0,"Hook is sucess!",0,0);
}else
{
MessageBox(0,"Hook is NULL!",0,0);
}
}



Exe cpp文件:

#include <Windows.h>
_declspec(dllimport) void SetHook();
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HWND hb;
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrveInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
WNDCLASSEX wcex;
wcex.cbClsExtra=0;
wcex.cbSize=sizeof(WNDCLASSEX);
wcex.cbWndExtra=0;
wcex.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
wcex.hCursor=LoadCursor(NULL,IDC_ARROW);
wcex.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wcex.hIconSm=LoadIcon(NULL,IDI_APPLICATION);
wcex.hInstance=hInstance;
wcex.lpfnWndProc=WndProc;
wcex.lpszClassName="ClassName";
wcex.lpszMenuName=NULL;
wcex.style=CS_HREDRAW|CS_VREDRAW;
RegisterClassEx(&wcex);
HWND hwnd=CreateWindow(wcex.lpszClassName,"Title",WS_OVERLAPPEDWINDOW+WS_VISIBLE,CW_USEDEFAULT,CW_USEDEFAULT,350,250,NULL,NULL,hInstance,NULL);
hb=CreateWindow("Button","Title",WS_CHILDWINDOW+WS_VISIBLE,0,0,100,50,hwnd,NULL,hInstance,NULL);
MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int) msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case WM_CREATE:
break;
case WM_COMMAND:
if((HWND)lParam==hb)
{
SetHook();
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd,message,wParam,lParam);
break;
}
return 0;
}



...全文
371 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
tanqing900920 2011-12-29
  • 打赏
  • 举报
回复
呵呵,对不起了,是我草率了,MSDN,use the WH_GETMESSAGE hook to monitor mouse and keyboard input and other messages posted to the message queue.我做了测试,WWH_CALLWNDPROC能截到WM_KILLFOCUS消息,用楼上子类化的方法没去测试,SDK很久没碰了,我已经全部转向LINUX了,手生了....MS的东东不好,很多的条条框框相当的不自由.....
Lactoferrin 2011-12-28
  • 打赏
  • 举报
回复
WM_KILLFOCUS是非队列消息,只能用WH_CALLWNDPROC钩,或者用SetWindowLong修改窗口过程
nightkids_008 2011-12-28
  • 打赏
  • 举报
回复
用微软的detours去拦截发消息的函数怎么样 嘿嘿~~~
tanqing900920 2011-12-28
  • 打赏
  • 举报
回复
....,窗口失去焦点是NOTIFY消息啊,call defwndproc 是你自己没写WM_NOTIFY处理分支直接CALL defwndproc,不信,你写个试试,绝对能拦截到
ITDeng 2011-12-28
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 saleayas 的回复:]

拦截 WH_CALLWNDPROC
[/Quote]
谢谢,但是WH_CALLWNDPROC好像不能修改消息内容
Saleayas 2011-12-28
  • 打赏
  • 举报
回复
拦截 WH_CALLWNDPROC
ITDeng 2011-12-28
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 saleayas 的回复:]

很多 WM_XX 消息是不放到消息队列中的。
是直接呼叫 wndProc.
[/Quote]
那请问我要拦截或者响应WM_XX消息要怎么做呢?要设置哪种钩子?
Saleayas 2011-12-28
  • 打赏
  • 举报
回复
很多 WM_XX 消息是不放到消息队列中的。
是直接呼叫 wndProc.
ITDeng 2011-12-28
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 tanqing900920 的回复:]

晕了,看了半天,你是这么个原因啊,KEY是键盘的钩子函数,MOUSE是MOUSE的,MSDN上讲的清清楚楚,不同类型有不同的PROC,真的是。。。。。。。。。
[/Quote]
我写的就是想拦截WM_KILLFOCUS消息的,所以用的是WH_GETMESSAGE类型的钩子。回调函数也是按照WH_GETMESSAGE写的
ITDeng 2011-12-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 tanqing900920 的回复:]

我的见解是 没有实例
就是找不到入口,没有和主程序连起来,可以加入DLLMAIN
BOOL WINAPI DllMain(HINSTANCE hInstance,ULONG What,LPVOID NotUsed)
{
switch(What)
{
case DLL_PROCESS_ATTACH:
hInst = hInstance;
break;
case DLL_PROCE……
[/Quote]
钩子回调子程序是肯定进去了,因为我下了断点,进去了。但就是拦截不到指定的消息WM_KILLFOCUS;
tanqing900920 2011-12-28
  • 打赏
  • 举报
回复
晕了,看了半天,你是这么个原因啊,KEY是键盘的钩子函数,MOUSE是MOUSE的,MSDN上讲的清清楚楚,不同类型有不同的PROC,真的是。。。。。。。。。
tanqing900920 2011-12-28
  • 打赏
  • 举报
回复
我的见解是 没有实例
就是找不到入口,没有和主程序连起来,可以加入DLLMAIN
BOOL WINAPI DllMain(HINSTANCE hInstance,ULONG What,LPVOID NotUsed)
{
switch(What)
{
case DLL_PROCESS_ATTACH:
hInst = hInstance;
break;
case DLL_PROCESS_DETACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
}
return TRUE;
}

还有最后面的return (0); 可以这样写么?
我做了个实验,是可以挂上钩子的(挂完记得要UNHOOK)

//DLL.C
#define _WIN32_WINNT 0x0501

#include <windows.h>
#include <stdio.h>
#pragma comment ( lib,"USER32.LIB" )

HINSTANCE hInst = NULL;

#pragma data_seg("hookdata")
HHOOK hMouse = NULL;
#pragma data_seg()

#pragma comment(linker,"/SECTION:hookdata,RWS")

#define DllExport extern "C" __declspec(dllexport)

DllExport void InstallHook(void);
DllExport void EndHook(void);
extern LRESULT CALLBACK MouseProc(int nCode,WPARAM wParam, LPARAM lParam );


BOOL WINAPI DllMain(HINSTANCE hInstance,ULONG What,LPVOID NotUsed)
{
switch(What)
{
case DLL_PROCESS_ATTACH:
hInst = hInstance;
break;
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}

DllExport void InstallHook( void )
{
hMouse = SetWindowsHookEx(WH_MOUSE , (HOOKPROC)MouseProc ,hInst,0);
}

LRESULT CALLBACK MouseProc(int nCode,WPARAM wParam, LPARAM lParam )
{
if ( wParam == WM_LBUTTONDOWN || wParam == WM_RBUTTONDOWN )
{
//MSG RESPOND...
MessageBox (NULL,"You Pressed Mouse Button","",0 );
}
return CallNextHookEx(hMouse,nCode,wParam,lParam);
}

DllExport void EndHook(void)
{
UnhookWindowsHookEx (hMouse);
hMouse = NULL;

}


//DLL.H

#ifndef __DLL_H__
#define __DLL_H__

#define DllImport extern "C" __declspec(dllimport)

DllImport void InstallHook(void);
DllImport void EndHook(void);

#endif


//在 main 或者 WinMain 最开始写 InstallHook ,在End 的时候记得EndHook



ITDeng 2011-12-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 healer_kx 的回复:]

别的消息你实验了嘛?
[/Quote]
别的我试了WM_KEYDOWN,可以拦截到,这个就不行,还有关于焦点的消息也不行。
healer_kx 2011-12-28
  • 打赏
  • 举报
回复
别的消息你实验了嘛?
ITDeng 2011-12-28
  • 打赏
  • 举报
回复
晕,怎么连路过的都木有啊...

64,650

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧