使用IMessageFilter和DoEvents进行模态操作

时间:2009-01-07 09:53:02

标签: windows winforms user-interface winapi

这是一个Windows窗体应用程序。我有一个函数可以模态捕获一些鼠标事件,直到满足条件。例如,我想等待用户在函数返回之前在窗口的客户区中选择一个点(或者可选地使用Escape键取消操作)。我使用以下结构:

Application::AddMessageFilter(someFilter);
while(someFilter->HasUserSelectedAPoint_Or_HitEscapeKey()){
    Application::DoEvents();
}
Application::RemoveMessageFilter(someFilter);

除了在控制进入while循环时占用近100%的CPU使用率时,这非常有效。我正在寻找类似于以下所示的替代方案:

Application::AddMessageFilter(someFilter);
while(someFilter->HasUserSelectedAPoint_Or_HitEscapeKey()){
    // Assuming that ManagedGetMessage() below is a blocking
    // call which yields control to the OS
    if(ManagedGetMessage())
        Application::DoEvents();
}
Application::RemoveMessageFilter(someFilter);

使用IMessageFilterDoEvents的正确方法是什么?在收到消息之前,如何将控制权交给操作系统?托管世界中的任何GetMessage等价物?

1 个答案:

答案 0 :(得分:1)

您可以在DoEvents()次呼叫之间将线程休眠500毫秒左右。尝试不同的值,看看感觉是否合适。