Это приложение Windows Forms. У меня есть функция, которая фиксирует некоторые события мыши модально, пока не будет выполнено условие. Например, я хотел бы подождать, пока пользователь выберет точку в клиентской области окна (или при желании отменить операцию с помощью клавиши Escape), прежде чем функция вернется. Я использую следующую структуру:
Application::AddMessageFilter(someFilter);
while(someFilter->HasUserSelectedAPoint_Or_HitEscapeKey()){
Application::DoEvents();
}
Application::RemoveMessageFilter(someFilter);
Это работает довольно хорошо, за исключением того, что занимает почти 100% использование процессора, когда управление входит в цикл while. Я ищу альтернативу, аналогичную показанной ниже:
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);
Как правильно использовать IMessageFilter
и DoEvents
? Как передать управление ОС до получения сообщения? Любой GetMessage
эквивалент в управляемом мире?