如何log/monitor选中WM_USER+nWindows条消息?
How to log/monitor selected WM_USER+n Windows messages?
我的代码中的一些对话框和数据模块需要延迟执行并通过调用 PostMessage() 来实现。这 不是 跨模块,即数据模块将具有在那里发布的 PostMessage 的处理程序,对话框也是如此。
不同模块中的代码之间存在(当然?)交互。
我想跟踪程序运行时某些特定消息的处理顺序。
(如何)我可以在 Delphi XE2 中执行此操作?
一切都在主 UI 线程中运行。
补充说明:
- 简单地设置断点是行不通的(我认为)。其中一些消息可以多次触发(想想 'updating tree list nodes towards the root'),我害怕在断点处停止时受到干扰。
- 示例序列:用户开始代码执行,在对话框中以 PostMessage(X) 结束,底层 Delphi 事件调用数据模块中的第三方软件,必须先完成执行,我执行 PostMessage(Y) 到'wait' 直到完成。我怀疑 Ys 在 X 之后被处理。
最简洁的方法是记录消息。日志记录允许您检查程序的操作,而不会像使用交互式调试断点那样干扰它。而对于消息处理,正如您所发现的,断点的干扰使得理解流程变得相当困难。
由于您要发布消息,因此它们由线程的消息队列处理。假设有问题的线程是 UI 主线程,那么您可以使用 Application.OnMessage
作为钩子来执行日志记录。 VCL 消息循环处理的所有排队消息都会通过此事件。通常最好使用 TApplicationEvents
实例来处理 Application
事件。
我的代码中的一些对话框和数据模块需要延迟执行并通过调用 PostMessage() 来实现。这 不是 跨模块,即数据模块将具有在那里发布的 PostMessage 的处理程序,对话框也是如此。
不同模块中的代码之间存在(当然?)交互。
我想跟踪程序运行时某些特定消息的处理顺序。
(如何)我可以在 Delphi XE2 中执行此操作?
一切都在主 UI 线程中运行。
补充说明:
- 简单地设置断点是行不通的(我认为)。其中一些消息可以多次触发(想想 'updating tree list nodes towards the root'),我害怕在断点处停止时受到干扰。
- 示例序列:用户开始代码执行,在对话框中以 PostMessage(X) 结束,底层 Delphi 事件调用数据模块中的第三方软件,必须先完成执行,我执行 PostMessage(Y) 到'wait' 直到完成。我怀疑 Ys 在 X 之后被处理。
最简洁的方法是记录消息。日志记录允许您检查程序的操作,而不会像使用交互式调试断点那样干扰它。而对于消息处理,正如您所发现的,断点的干扰使得理解流程变得相当困难。
由于您要发布消息,因此它们由线程的消息队列处理。假设有问题的线程是 UI 主线程,那么您可以使用 Application.OnMessage
作为钩子来执行日志记录。 VCL 消息循环处理的所有排队消息都会通过此事件。通常最好使用 TApplicationEvents
实例来处理 Application
事件。