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

但是我有一组相当快速的处理程序,其中我将视图缓冲到文件中。在缓冲过程中,可能会发送一些系统消息(例如重绘或滚动条移动或其他事件)。我想防止这些消息被ProcessMessages处理,直到缓冲完成。

有什么办法可以:


在我的过程完成之前,请阻止Application.ProcessMessages,或者
捕获过程中生成的所有消息,直到过程结束才释放它们。

最佳答案

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

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


查看WM_PRINT(xxx)消息,该消息允许子控件将自身绘制到位图中
尝试LockWindowUpdate Win32 API方法调用,该方法将关闭所有到该控件的绘画消息
如果需要,可以覆盖控件类甚至父类上的WndProc / DefaultWndProc方法,并为每个发送的消息简单地返回“ true”
在控件类甚至父类上覆盖特定的控制方法(例如“滚动条已移动”,“ OnPaint”,“ OnPaintBackground”等),并且如果正在进行缓冲,则不执行任何操作


重写WndProcDefaultWndProc并为每个消息简单地返回true实质上会“关闭” ProcessMessages,但是这样做是不安全的,因为控件可能需要处理一个或多个消息才能正常运行。

无法关闭ProcessMessages(无需重写VCL代码进行消息处理),因为这是VCL表单的消息循环构造方式的一部分。

07-24 09:24