如何正确钩WM_COMMAND
How properly hook WM_COMMAND
我正在尝试在 mfc 窗口中挂钩按钮单击。我用了WM_COMMAND和WM_NOTIFY。对于测试,如果单击该按钮,挂钩必须创建一个消息框。问题是它对按钮点击没有反应。以下是对WM_COMMAND和WM_NOTIFY做出反应的代码:
LPMSG msg = (LPMSG)lParam;
switch( msg->message )
{
case WM_COMMAND:
MessageBox( NULL,"HOOK","YOOOO",MB_ICONEXCLAMATION );
break;
case WM_NOTIFY:
MessageBox( NULL,"HOOK","YOOOOO",MB_ICONEXCLAMATION );
break;
}
这是钻孔 dll 的代码:
#include <Windows.h>
#include "FindingWindow.h"
#pragma comment( linker,"/SECTION:.SHARED,RWS" )
#pragma data_seg( ".SHARED" )
CaptureTextWindow* ctw;
HHOOK hook = 0;
HMODULE hInstance = 0;
HWND hWndServer = NULL;
#pragma data_seg()
static LRESULT CALLBACK msghook(int nCode, WPARAM wParam, LPARAM lParam);
__declspec(dllexport) BOOL clearMyHook(HWND hWnd);
BOOL APIENTRY DllMain( HINSTANCE hInst, DWORD ul_reason_for_call, LPVOID lpReserved )
{
switch( ul_reason_for_call )
{
case DLL_PROCESS_ATTACH:
hInstance = hInst;
return TRUE;
case DLL_PROCESS_DETACH:
if(hWndServer != NULL)
clearMyHook(hWndServer);
return TRUE;
}
return TRUE;
}
__declspec(dllexport) BOOL WINAPI setMyHook(HWND hWnd)
{
if(hWndServer != NULL)
return FALSE;
hook = SetWindowsHookEx(
WH_CALLWNDPROC,
(HOOKPROC)msghook,
hInstance,
0);
if(hook != NULL)
{ /* success */
hWndServer = hWnd;
return TRUE;
} /* success */
return FALSE;
}
__declspec(dllexport) BOOL clearMyHook(HWND hWnd)
{
if(hWnd != hWndServer)
return FALSE;
BOOL unhooked = UnhookWindowsHookEx(hook);
if(unhooked)
hWndServer = NULL;
return unhooked;
}
static LRESULT CALLBACK msghook( int nCode, // hook code
WPARAM wParam , // message identifier
LPARAM lParam )
{
if( nCode < 0 )
{
CallNextHookEx( hook, nCode, wParam, lParam );
return 0;
}
LPMSG msg = (LPMSG)lParam;
switch( msg->message )
{
case WM_COMMAND:
MessageBox( NULL,"HOOK","YOOOO",MB_ICONEXCLAMATION );
break;
case WM_NOTIFY:
MessageBox( NULL,"HOOK","YOOOOO",MB_ICONEXCLAMATION );
break;
}
return CallNextHookEx( hook, nCode, wParam, lParam );
}
我不仅使用WM_COMMAND因为我认为mb它会起作用,但它没有。谢谢你的回答。
WH_CALLWNDPROC
钩子的lParam
是 CWPSTRUCT
类型。您的CallWndProc
应如下所示:
// ...
const CWPSTRUCT& cwps = *(CWPSTRUCT*)lParam;
switch ( cwps.message ) {
case WM_COMMAND:
MessageBox( ... );
break;
// ...
相关文章:
- netcat command in c++
- VS Code "command":"make"与终端窗口中的命令行"make"不同
- Poloniex API "Invalid command" c++ libcurl
- "WM" C++是什么意思?
- 如何使用键盘的特殊键,如Command、Shift、Alt、Tab或C/C++程序中的功能键
- 从系统("command") (C++) 设置变量
- Google Assistant SDK (C++) - Broadcast Command
- :<command-line>0:3:警告:ISO C++11 要求宏名称后有空格
- Command Line Arguments wxCmdLineArgsArray in wxWidgets
- 如何修复"/bin/sh: bc: command not found"
- C++链接器错误 ( "Linker command failed with exit code 1" )
- Ssh command from Qt
- 如何在Xcode中修复'sh: brew: command not found'?
- 字符串问题中的系统( "command" ) 字符串
- Xcode 8.3 command line C++
- 什么是窗口最大化/最小化/恢复的WM Windows消息
- MySQL 异常"connection lost during query"、"MySQL server has gone away"和"command out of sync"
- QT创建者简单的C 程序来自IDE,但不能从Command LNE运行
- 在 Eclipse 中使用 GDB 时出错:"Command '-list-features' is timed out"
- 创建类对象时,我得到"error: linker command failed with exit code 1"