如何在Delphi中防止ProcessMessages

lke*_*ler 4 delphi messages idle-processing

Application.ProcessMessages命令是众所周知的,我在长进程中使用它来确保我的程序不会占用计算机.

但我有一个相当快速的处理集,我在缓冲视图到文件.在缓冲过程期间,可能会发送一些系统消息(例如重绘或滚动条移动或其他事件).我希望防止这些被ProcessMessages处理,直到我的缓冲完成.

有没有办法:

  1. 阻止Application.ProcessMessages直到我的过程完成,或

  2. 捕获在我的过程中生成的所有消息,并且不会释放它们直到过程结束.

Mik*_*e J 5

允许ProcessMessages继续即使它发送您不想要的消息也不应被归类为有问题.通过一些代码重构,您可以将缓冲方法移动到单独的线程中并从那里开始.

如果您尝试将控件的"可视内容"复制到文件中,

  • 查看WM_PRINT(xxx)消息,该消息允许子控件将自己绘制为位图
  • 尝试LockWindowUpdateWin32 API方法调用,它将关闭所有绘制消息到该控件
  • 如果需要,覆盖控件类甚至父类的WndProc/ DefaultWndProc方法,并为发送的每条消息返回"true"
  • 覆盖控件类甚至父级的特定控制方法(例如"滚动条移动"," OnPaint"," OnPaintBackground"等),如果缓冲正在进行中,则不执行任何操作

覆盖WndProcDefaultWndProc简单地为每个消息返回true基本上"关闭",ProcessMessages 这样做是不安全的,因为控件可能需要处理一个或多个消息才能正常运行.

关闭ProcessMessages是不可能的(没有重写用于消息处理的VCL代码),因为它是VCL表单的消息循环的构建方式的一部分.

  • 根据Raymond Chen的说法,永远不应该使用LockWindowUpdate()API:http://blogs.msdn.com/oldnewthing/archive/2007/02/23/1747713.aspx至少它不应该用于你想要的东西用它来:http://blogs.msdn.com/oldnewthing/archive/2007/02/22/1742084.aspx (4认同)