我正在将Windows消息处理程序/拦截器的一些代码从Lazarus移动到Delphi。
在拉撒路,我有这样的代码:
function WndCallback(Ahwnd: HWND; uMsg: UINT; wParam: WParam; lParam: LParam):LRESULT; stdcall;
(Handle WM_ messages)
result:=CallWindowProc(PrevWndProc,Ahwnd, uMsg, WParam, LParam);
end;
(with this invoked in the FormCreate)
PrevWndProc:=Windows.WNDPROC(SetWindowLongPtr(Self.Handle,GWL_WNDPROC,PtrInt(@WndCallback)));
注意,WndCallback可以将LRESULT返回给非Pascal应用程序上的调用SendMessage。
在Delphi中,Windows.WNDPROC不存在,所以我创建了自己的WndProc(),它覆盖了VCL中的WndProc()。然而,WndProc()是一个过程,而不是函数,因此它不能向调用SendMessage返回结果。有没有办法从Delphi WndProc()返回结果?
谢谢!
1条答案
按热度按时间xeufq47z1#
在被覆盖的
WndProc()
1方法中,可以通过设置TMessage.Result
字段将结果值发送回调用者,或者调用inherited
方法进行默认处理。1:顺便说一句,虚拟
WndProc()
方法也存在于FreePascal/Lazarus中。也有一个虚拟MainWndProc()
方法。所以,在任何一个编译器中,你都不需要在你的TForm
上使用SetWindowLongPtr()
。