gpt4 book ai didi

delphi - Lazarus/FPC 上的 WM_COMMAND 问题

转载 作者:行者123 更新时间:2023-12-03 15:13:52 24 4
gpt4 key购买 nike

我有 MainMenu 表单,我想在用户从菜单中选择命令项时进行拦截。这在德尔福中有效:

type
TForm1 = class(TForm)
... // Memo and MainMenu created
protected
procedure WMCommand(var Info: TWMCommand); message WM_COMMAND;
end;


procedure TForm1.WMCommand(var Info: TWMCommand);
begin
if (Info.ItemID < 10) then
Memo1.Lines.Add('WMCommand ' + IntToStr(Info.ItemID));
end;

在主菜单中我添加了一些项目,当我从菜单中选择这些项目时我的 Memo1 充满了:

WMCommand 2
WMCommand 3
WMCommand 3
WMCommand 2
WMCommand 5
...

我将此应用程序移植到FPC/Lazarus,但似乎WM_COMMAND处理程序未被调用!当我在 Delphi 中的 TForm1.WMCommand 中设置断点时,然后 Delphi在主窗体出现之前多次停止。拉撒路从未停止在这个断点上。我认为 WM_COMMAND 有问题在拉撒路,但也许我不知道一些事情。有什么想法吗?

我在 WinXP 上使用 Lazarus 0.9.28.2 beta 和 FPC 2.2.4。

编辑:

使用 Winspector 我检查 MainMenu 是否生成 WM_COMMAND:

WM_COMMAND
Code: 0
Control ID: 2
Control HWND: 0x00000000
Message Posted
Time: 09:37:14.0968

我认为 Lazarus/FPC 中的 WM_COMMAND 消息方法处理存在错误,我报告了它:http://bugs.freepascal.org/view.php?id=15521

最佳答案

在 LCL 应用程序中,您具有以下层:

  • 申请
  • 拼箱
  • 小组件集接口(interface)(例如 win32/win64、qt、gtk2、carbon)
  • 小工具集

WM_COMMAND 是一个从 widgetset 层到 Widget Set 接口(interface)层的 winapi 消息。这些消息不会传递到更高层,考虑到可移植性,其他小部件集不会产生此类消息。

如果您想捕获消息,则必须编写非可移植小部件集特定代码(在本例中为 winapi 代码)。您可以使用 setwindowlong 覆盖 windowproc。请参阅Lazarus wiki举个例子。

关于delphi - Lazarus/FPC 上的 WM_COMMAND 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2048983/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com