为什么消息处理程序在调试模式下不起作用?

时间:2016-05-04 01:38:03

标签: delphi

我在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;

1 个答案:

答案 0 :(得分:9)

如果您的TForm1课程已在IDE的表单设计器中打开,并且其Caption在{I}}中为test form,则可能FindWindow()在运行时找到那个 HWND而不是正在运行的应用程序中的HWND(您可以使用GetWindowThreadProcessId()来验证)。这意味着您会将邮件发送到错误的HWND。在调试器中运行时,使用FindWindow()按标题搜索TForm时,这是一个常见问题。关闭IDE中的TForm1源文件,然后FindWindow()再也找不到HWND,它会在您正在运行的应用中找到HWND代替。

顺便说一下,您的_Handle变量需要声明为HWNDTHandle而不是CardinalSendMessage()的最后一个参数需要类型转换为LPARAM而不是integer