FindWindowEx не может найти дескриптор окна - PullRequest
1 голос
/ 03 февраля 2010

Я пытаюсь найти дескриптор диалога, как только он открывается.

Теперь, как только диалог открывается, я пытаюсь вызвать FindWindowEx для этого диалога в отдельном потоке, но он возвращает NULL.

Затем я усыпляю перед вызовом FindWindowEx. Работает через некоторое время после сна.

Похоже, что FindWindowEx вызывается еще до того, как диалоговое окно создано, а sleep помогает создать диалоговое окно и, следовательно, иногда оно работает.

Теперь я поместил в сон какое-то случайное значение. И это не выглядит хорошим подходом, так как он может потерпеть неудачу в любое время.

Существует ли какой-либо метод полного доказательства, чтобы я мог каждый раз получать управление через FindWindowEx, не переводя поток в спящий режим.

Ответы [ 2 ]

2 голосов
/ 03 февраля 2010

Если диалоговое окно, которое вы ищете, является вашим диалоговым окном, то есть вы управляете кодом, то вы можете отправить сообщение из своего диалогового окна в приложение для просмотра, которое говорит: «О, привет!»

Если это не ваше диалоговое окно и вы не хотите крутиться, вы можете создать ловушку Windows для сообщения WM_CREATE.

1 голос
/ 03 февраля 2010

Очень простым решением было бы повторно вызывать FindWindowEx в цикле.

HWND h = NULL;
while (1) {
      h = FindWindowEx(...);
      if (h) {
         break;
      } 
      Sleep(100);
   }

Это не пуленепробиваемый - это бесконечный цикл, если диалоговое окно открывается или закрывается слишком быстро (хотя это маловероятно). Чтобы отловить оба случая, позвольте основному потоку (который создает и запускает диалоговое окно) поддерживать простое свойство bool, которое рабочий поток запрашивает, чтобы выяснить, существует ли еще диалог.

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