按键消息的拦截
-
拦截是为了在原有功能的基础上增加自己的操作
-
扩展:当按钮接收到点击消息的时候,响应的是WM_LBUTTONDOWN消息,按钮的会被这个消息打包成一个WM_COMMAND 消息发送给父窗口,父窗口接收到之后再进行处理
-
-
区别在于一个修改的是一个窗口,一个会影响到所有使用这个窗口类的窗口
// 保存旧的按钮回调
WNDPROC OldButtonProc = nullptr;
// 用于处理接管到的消息的回调函数
LRESULT CALLBACK ButtonProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
// 1. 按钮作为一个窗口,需要响应 LBUTTONDOWN
case WM_LBUTTONDOWN:
{
// 还原回调函数
SetWindowLong(hWnd, GWL_WNDPROC, (LONG)OldButtonProc);
MessageBox(hWnd, L"设置的处理函数", L"WM_LBUTTONDOWN", MB_OK);
// 获取父窗口(不是重点)
// HWND hParent = GetParent(hWnd);
// PostMessage(hParent, WM_COMMAND, IDC_BUTTON1, (LPARAM)hWnd);
break;
}
}
// 为了保持原有功能不变,应该返回原按钮的回调函数
return OldButtonProc(hWnd, uMsg, wParam, lParam);
}
// 对话框回调函数
INT_PTR CALLBACK DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
// 响应按钮的点击,修改回调函数
case WM_COMMAND:
{
// 1. 修改【窗口】的回调函数
// 参数1: 想要设置的窗口句柄
// 参数2: 想要设置的类型 GWL
// 参数3: 要替换的内容
// 返回值是修改之前的数据
OldButtonProc = (WNDPROC)SetWindowLong(
(HWND)lParam, GWL_WNDPROC, (LONG)ButtonProc);
// 默认的响应
MessageBox(hWnd, L"默认的处理函数", L"WM_COMMAND", MB_OK);
break;
}
case WM_CLOSE:
{
// 销毁对话框
EndDialog(hWnd, 0);
break;
}
default:
break;
}
return FALSE;
} -