我在 Windows 10 中使用 berlin。
以下消息处理程序在构建的应用程序中运行良好,但在 Debug模式下运行不佳。
如何调试消息处理程序?
type
TForm1 = class(TForm)
Memo1: TMemo;
procedure onReceive(var message: TMessage); message WM_COPYDATA;
end;
procedure TForm1.onReceive(var message: TMessage);
begin
Memo1.Lines.Add('a');
end;
sender代码如下,struct的值无意义。
procedure TForm1.FormClick(Sender: TObject);
var
_Handle: Cardinal;
_CopyDataStruct: TCopyDataStruct;
begin
_Handle := FindWindow(nil, 'test form');
_CopyDataStruct.dwData := 0;
_CopyDataStruct.cbData := Sizeof(_Handle);
_CopyDataStruct.lpData := @_handle;
SendMessage(_Handle, WM_COPYDATA, Handle, integer(@_CopyDataStruct));
end;
最佳答案
如果您的 TForm1
类在 IDE 的表单设计器中打开,并且它的 Caption
在对象检查器中是 test form
,那么 FindWindow()
可能会在运行时找到 that HWND
而不是正在运行的应用程序中的 HWND
(您可以使用 GetWindowThreadProcessId()
来验证)。这意味着您会将消息发送到错误的 HWND
。这是在调试器中运行时使用 FindWindow()
通过其标题搜索 TForm
时的常见问题。在IDE中关闭TForm1
源文件,然后FindWindow()
就找不到那个HWND
了,它会找到HWND
改为在您正在运行的应用程序中。
顺便说一句,您的_Handle
变量需要声明为HWND
或THandle
而不是Cardinal
,并且SendMessage()
的最后一个参数需要类型转换为 LPARAM
而不是 integer
。
关于delphi - 为什么消息处理程序在 Debug模式下不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37017034/