C++ 处理按钮点击按钮程序
我正在使用以下代码创建一个按钮并更改其进程:C++ 处理按钮点击按钮程序,c++,winapi,C++,Winapi,我正在使用以下代码创建一个按钮并更改其进程: INT_PTR CALLBACK Proc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { //switch( LOWORD(wParam) ) //switch( HIWORD(wParam) ) switch (message) { case 200: case BN_CLICKED: MessageBox(NULL,
INT_PTR CALLBACK Proc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
//switch( LOWORD(wParam) )
//switch( HIWORD(wParam) )
switch (message)
{
case 200:
case BN_CLICKED:
MessageBox(NULL,NULL,NULL,NULL);
break;
default: return oldproc(hDlg, message, wParam, lParam);
}
return (INT_PTR)FALSE;
}
及
问题是,无论我如何在Proc中处理消息,都不会创建messagebox
注意:注释最后一行并在窗口过程中处理它,如下所示:
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
switch (wmId)
{
case 200:
if(wmEvent == BN_CLICKED)
MessageBox(NULL,NULL,NULL,NULL);
... }
工作很好,但我不能使用这个,因为我是如何设计的东西
有什么方法可以让它工作吗?您看不到您的消息框,因为BM\u CLICK不是按钮接收的消息。它是当您希望按钮模拟单击操作时发送给按钮的消息 你要找的是通知。但是,BN_CLICKED被包装在WM_命令消息中,该消息被发送到按钮的父窗口,而不是按钮本身。因此,您需要对父窗口进行子类化以接收它 如果这不是一个选项,那么您可以通过SetWindowsHookEx使用特定于线程的消息钩子,并让回调查找发送到按钮父窗口的消息。例如:
HWND hBtn, hBtnParent;
HHOOK hHook;
LRESULT CALLBACK BtnMsgProc(int iCode, WPARAM wParam, LPARAM lParam)
{
if ((iCode == HC_ACTION) && (wParam == PM_REMOVE))
{
MSG *msg = reinterpret_cast<MSG*>(lParam);
if ((msg->hwnd == hBtnParent) &&
(msg->message == WM_COMMAND) &&
(HIWORD(msg->wParam) == BN_CLICKED) &&
(reinterpret_cast<HWND>(msg->lParam) == hBtn))
{
// button has been clicked...
}
}
return CallNextHookEx(hHook, iCode, wParam, lParam);
}
您看不到消息框,因为BM_CLICK不是按钮接收的消息。它是当您希望按钮模拟单击操作时发送给按钮的消息 你要找的是通知。但是,BN_CLICKED被包装在WM_命令消息中,该消息被发送到按钮的父窗口,而不是按钮本身。因此,您需要对父窗口进行子类化以接收它 如果这不是一个选项,那么您可以通过SetWindowsHookEx使用特定于线程的消息钩子,并让回调查找发送到按钮父窗口的消息。例如:
HWND hBtn, hBtnParent;
HHOOK hHook;
LRESULT CALLBACK BtnMsgProc(int iCode, WPARAM wParam, LPARAM lParam)
{
if ((iCode == HC_ACTION) && (wParam == PM_REMOVE))
{
MSG *msg = reinterpret_cast<MSG*>(lParam);
if ((msg->hwnd == hBtnParent) &&
(msg->message == WM_COMMAND) &&
(HIWORD(msg->wParam) == BN_CLICKED) &&
(reinterpret_cast<HWND>(msg->lParam) == hBtn))
{
// button has been clicked...
}
}
return CallNextHookEx(hHook, iCode, wParam, lParam);
}
有关SetWindowsHookEx示例的问题:有关SetWindowsHookEx示例的问题:1。是个打字错误,对不起。能否提供SetWindowsHookEx的示例用法?1。是个打字错误,对不起。能否提供SetWindowsHookEx的示例用法?
hBtnParent = hWnd;
hBtn = CreateWindowEx(
NULL,
L"button",
L"TEXT",
WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_DEFPUSHBUTTON,
50,
50,
500,
500,
hWnd,
(HMENU)200,
hInstance,
NULL);
hHook = SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)BtnMsgProc, NULL, GetCurrentThreadId());
...
UnhookWindowsHookEx(hHook);
DestroyWindow(hBtn);