我在Windows 10中使用柏林。
以下消息处理程序在构建的应用程序中运行良好,但不处于调试模式。
如何调试消息处理程序?
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;
发件人代码如下,结构的值没有意义。
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;
答案 0 :(得分:9)
如果您的TForm1
课程已在IDE的表单设计器中打开,并且其Caption
在{I}}中为test form
,则可能FindWindow()
在运行时找到那个 HWND
而不是正在运行的应用程序中的HWND
(您可以使用GetWindowThreadProcessId()
来验证)。这意味着您会将邮件发送到错误的HWND
。在调试器中运行时,使用FindWindow()
按标题搜索TForm
时,这是一个常见问题。关闭IDE中的TForm1
源文件,然后FindWindow()
再也找不到HWND
,它会在您正在运行的应用中找到HWND
代替。
顺便说一下,您的_Handle
变量需要声明为HWND
或THandle
而不是Cardinal
,SendMessage()
的最后一个参数需要类型转换为LPARAM
而不是integer
。