注:窗口回调函数的函数指针定义typedef LRESULT CALLBACK (* WNDPROC)(HWND, UINT, WPARAM, LPARAM);
WNDPROC OldWndProc;
LRESULT CALLBACK NewWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){
switch (Msg)
{
......
}
return CallWindowProc(OldWndProc,g_Wnd,Msg,wParam,lParam);
}
OldWndProc = (WNDPROC)GetWindowLong(g_Wnd,GWL_WNDPROC);
SetWindowLong(hwnd, GWL_WNDPROC,(LPARAM)(WNDPROC)NewWndProc);
通过调用SetWindowLong函数可以修改该窗体类的回调函数。
CallBack 函数中的wParam和lParam有什么区别:
WPARAM wParam, 定义成WORD型
LPARAM lParam 定义成LONG型
在Win 3.x中,WPARAM是16位的,而LPARAM是32位的,两者有明显的区别。
在Win32 API中,WPARAM和LPARAM都是32位,所以没有什么本质的区别。
但是习惯上,我们愿意使用LPARAM传递地址,而WPARAM传递其他参数。
function MouseHookProc(nCode: Integer; wPar: WPARAM; lPar: LPARAM): lResult; stdcall;
如果我要判断鼠标左键是否按下,用wParam==WM_LBUTTONDOWN判断.
lParam 是 (tagMOUSEHOOKSTRUCT的指针)PMouseHookStruct类型,主要是获得发送窗口句柄,鼠标坐标 ,以及其他一些信息 。
lParam 用的时候需要强制转换,转换成PMouseHookStruct类型.
PMouseHookStruct = ^TMouseHookStruct;
tagMOUSEHOOKSTRUCT = packed record
pt: TPoint;
hwnd: HWND;
wHitTestCode: UINT;
dwExtraInfo: DWORD;
end;
TMouseHookStruct = tagMOUSEHOOKSTRUCT;
例如:
function GetMsgProc(nCode: Integer; wPara: WPARAM; lPara: LPARAM)
: lResult; stdcall;
var
hGetMsgHook:HHOOK;
Msg: TMsg;
begin
if (nCode >= 0) then
begin
FillChar(pMsgData^, Sizeof(TMessageRecord), #0);
Msg := TMsg(Pointer(lPara)^);
end;
Result := CallNextHookEx(hGetMsgHook, nCode, wPara, lPara);
end;
数据结构原型
typedef struct _WNDCLASS{
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HANDLE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName;
}WNDCLASS;
结构说明
WNDCLASS 结构包含了RegisterClass函数注册的类属性
分量简介
style: 指定类风格。这些风格可通过按位或操作组合起来。风格如下:










