delphi - 为什么消息处理程序在 Debug模式下不起作用?

标签 delphi

我在 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 变量需要声明为HWNDTHandle 而不是Cardinal,并且SendMessage() 的最后一个参数需要类型转换为 LPARAM 而不是 integer

关于delphi - 为什么消息处理程序在 Debug模式下不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37017034/

相关文章:

java - Delphi 到 Java 代码转换 : image. canvas.pixels

delphi - 如何获取集合类型的任何变量的元素数量?

delphi - 表格未更新

delphi - 为什么编译器给我这个错误: Declaration of 'GetItem' differs from previous declaration?

Delphi FMX TImage 手动 alpha 透明度映射失败

delphi - BDE、Windows 7 和 UAC

Delphi App调试时出现 "No Debug Info"

delphi - 如何使用delphi将十六进制转换为十进制以及将十六进制转换为八进制?

delphi - 使用TiniFile类编写带注释行的INI文件

delphi - 在Delphi中,浮点类型最大值的关键字是什么?