#include <windows.h>
#include "resource.h"
INT_PTR CALLBACK MainProc(
_In_ HWND hwndDlg,
_In_ UINT uMsg,
_In_ WPARAM wParam,
_In_ LPARAM lParam
);
INT_PTR CALLBACK BtnProc(
_In_ HWND hwndDlg,
_In_ UINT uMsg,
_In_ WPARAM wParam,
_In_ LPARAM lParam
);
WNDPROC g_oldProc = nullptr;
INT WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd)
{
DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, MainProc);
return 0;
}
INT_PTR CALLBACK MainProc(
_In_ HWND hwndDlg,
_In_ UINT uMsg,
_In_ WPARAM wParam,
_In_ LPARAM lParam
)
{
switch (uMsg)
{
case WM_CLOSE:
EndDialog(hwndDlg, 0);
break;
case WM_COMMAND:
{
WORD wID = LOWORD(wParam);
if (wID == IDC_BUTTON1)
{
MessageBox(hwndDlg, TEXT("你在父窗口中点击了我!"), 0, MB_YESNO);
/*下面的代码可以写在任何地方*/
//1 改变按钮1的消息处理函数,变成我的
HWND hBtn1 = GetDlgItem(hwndDlg, IDC_BUTTON1);
// 函数返回原来的信息
g_oldProc = (WNDPROC)SetWindowLong(hBtn1, GWL_WNDPROC, (LONG)BtnProc);//这个函数很重要
//将控件的回调函数替换成BtnProc,就是说下面再继续执行操作的话
//那么回掉函数将不会是原来的,原来的回掉函数被g_oldProc所记录,取而代之的将是一个新的回掉函数,它就是BtnProc
//原来的回调函数被g_oldProc所记录
}
}
break;
default:
break;
}
return 0;
}
INT_PTR CALLBACK BtnProc(
_In_ HWND hwndDlg,// 按钮的
_In_ UINT uMsg,
_In_ WPARAM wParam,
_In_ LPARAM lParam
)
{
switch (uMsg)
{
case WM_LBUTTONDOWN:
{
MessageBox(hwndDlg, TEXT("你在自己的回调函数里被处理了!"), 0, MB_YESNO);
(WNDPROC)SetWindowLong(hwndDlg, GWL_WNDPROC, (LONG)g_oldProc);//新的消息回调函数获取消息以后
// 继续把消息抛给g_oldProc所保存的原来的
//消息回调函数
g_oldProc = nullptr;//这是一个编程习惯,将指针设定为空
return 1;
}
break;
default:
break;
}
return g_oldProc(hwndDlg,uMsg,wParam,lParam);
}
SetWindowLong
说明:
g_oldProc = (WNDPROC)SetWindowLong(hBtn1, GWL_WNDPROC, (LONG)BtnProc);//这个函数很重要
//将控件的回调函数替换成BtnProc,就是说下面再继续执行操作的话
//那么回掉函数将不会是原来的,原来的回掉函数被g_oldProc所记录,取而代之的将是一个新的回掉函数,它就是BtnProc
//原来的回调函数被g_oldProc所记录
}
SetWindowLong原型;
Long SetWindowLong (
HWND hWnd , //窗口句柄,将要截获的那个控件的ID
int nIndex, //索引,它是一个宏,可以指,消息处理函数,窗口ID,这里如果是GWL_WNDPROC的话,下面一个参数将是新的回掉函数
LONG dwNewLong //一般指的是新的回掉函数
)
nIndex的值:
GWL_EXSTYLE ----> 扩展风格
GWL_STYLE ------>风格
GWL_WNDPROC----->消息处理函数
GWL_HINSTANCE---->实例
GWL_ID----------->窗口ID