WndProc -拉撒路与 Delphi

kb5ga3dv  于 2022-12-23  发布在  其他
关注(0)|答案(1)|浏览(156)

我正在将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()返回结果?
谢谢!

xeufq47z

xeufq47z1#

在被覆盖的WndProc() 1方法中,可以通过设置TMessage.Result字段将结果值发送回调用者,或者调用inherited方法进行默认处理。

procedure TMyForm.WndProc(var Message: TMessage);
begin
  (Handle WM_ messages)
  if (want to return a value) then
    Message.Result := ...
  else
    inherited;
end;

1:顺便说一句,虚拟WndProc()方法也存在于FreePascal/Lazarus中。也有一个虚拟MainWndProc()方法。所以,在任何一个编译器中,你都不需要在你的TForm上使用SetWindowLongPtr()

相关问题