PeekMessage проблема - PullRequest
       3

PeekMessage проблема

3 голосов
/ 06 августа 2010

Я попытался проверить пример «Проверка очереди сообщений» на этой странице:

http://msdn.microsoft.com/en-us/library/ms644928(VS.85).aspx

Чтобы проверить это, я создал простое окно с элементом управления и несколькими кнопками,

но это не работает так, как я ожидал. Он должен отображать строку "Some Text" в EditControl до тех пор, пока

Я нажимаю кнопку ... но проблема в том, что она отображает строку только в первый раз, а затем кажется, что она блокируется в цикле PeekMessage.

Я заметил, что после выполнения вызова DispatchMessage (& msg) он, кажется, работает правильно.

Как я могу решить ??? Обязательно ли вызывать DispatchMessage (& msg) ???

Спасибо!

HWND hwnd; 
BOOL fDone; 
MSG msg;

fDone = FALSE; 
while (!fDone) 
{ 
 SetFocus(EditControl);
 SendMessage(EditControl, EM_REPLACESEL, (WPARAM)FALSE, (LPARAM)TEXT("Some Text\r\n"));

 while (PeekMessage(&msg, hwnd, 0, 0, PM_REMOVE)) // It blocks here, if I press any button it always sets fDone to TRUE without exiting the loop 
 { 

// DispatchMessage(&msg); uncomment this and it works 

 switch(msg.message) 
 { 
 case WM_LBUTTONDOWN: 
 case WM_RBUTTONDOWN: 
 case WM_KEYDOWN:
 {
 fDone = TRUE;
 SetFocus(EditControl);
 SendMessage(EditControl, EM_REPLACESEL, (WPARAM)FALSE, (LPARAM)TEXT("fDone set to TRUE\r\n"));
 }
 } 
 } 
}

Ответы [ 3 ]

1 голос
/ 06 августа 2010

Ну, это не имеет никакого смысла, конечно. Если флаг fDone установлен в TRUE, он никак не может оставаться внутри цикла и продолжать вызывать PeekMessage (). Также не может блокировать PeekMessage (). Подобный эффект может произойти, если вырвет кадр стека, но здесь это не указано и всегда является последним объяснением.

Более вероятное объяснение состоит в том, что этот код многократно выполняется сверху. Может быть, вы вызываете это из оконной процедуры. Да, это может легко завести вас в бесконечный цикл, если вы не вызовите DispatchMessage (). Сообщение WM_PAINT является очевидным кандидатом, оно будет просто запускаться без остановки, если вы не вызовете Begin / EndPaint (). Это просто теория, конечно, не могу знать наверняка, не зная, как вызывается этот код.

0 голосов
/ 03 июня 2018

У вас та же проблема, что и у меня: Создание основного окна

Для вашего коммутатора отсутствует регистр по умолчанию, иначе окно не сможет обработать все остальные случаи и не будет работать.

switch(msg.message) 
 { 
     case WM_LBUTTONDOWN: 
     case WM_RBUTTONDOWN: 
     case WM_KEYDOWN:
     {
         fDone = TRUE;
         SetFocus(EditControl);
         SendMessage(EditControl, EM_REPLACESEL, (WPARAM)FALSE, (LPARAM)TEXT("fDone set to TRUE\r\n"));
     }

     default:
     {
         DispatchMessage(&msg)
     }
 } 
0 голосов
/ 06 августа 2010

Вам нужен цикл GetMessage из этой статьи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...