SendMessage застрял после нажатия кнопки

Странная проблема, которую я не могу понять. Ищите главное окно, затем я ищу кнопку управления с надписью "Пуск". После того, как он находит начало и посылает нажатие кнопки, он просто сидит и никогда не проходит мимо этого, поэтому я никогда не вижу "Уходящий цикл" в консоли.

Кнопка действительно нажимается, и появляется окно сообщения, на которое я продолжу отвечать за пределами этого раздела кода. Странно то, что как только я вручную отвечаю на это поле, оно выходит за пределы NativeMethods.SendMessage(start, BM_CLICK, IntPtr.Zero, ""); и я вижу "Leaving Loop", а потом все счастливы и продолжают свой путь.

Что мне здесь не хватает? Надеюсь, я объяснил это достаточно хорошо.

while (!mainFound)
{
    hwnd = NativeMethods.FindWindow(null, "Loader");
    if (!hwnd.Equals(IntPtr.Zero))
    {
        Console.WriteLine("Found Main");

        IntPtr p = IntPtr.Zero;
        while (!mainFound)
        {
            hwndChild = NativeMethods.FindWindowEx(hwnd, p, null, null);
            if (hwndChild == IntPtr.Zero)
            {
                 break;
            }

            IntPtr start = NativeMethods.FindWindowEx(hwndChild, IntPtr.Zero, null, "Start");
            if (!start.Equals(IntPtr.Zero))
            {
                Console.WriteLine("Found Start");
                NativeMethods.SendMessage(start, BM_CLICK, IntPtr.Zero, "");
                Console.WriteLine("Leaving Loop");
                mainFound = true;
            }

             //Console.WriteLine(hwndChild);
             p = hwndChild;
       }
 }   

}

1 ответ

Решение

SendMessage является синхронным вызовом: он ожидает обработки сообщения перед возвратом. Из вашего описания звучит так, что обработчик для BM_CLICK отображает модальное диалоговое окно, что означает, что SendMessage не вернется, пока модальное диалоговое окно не будет закрыто.

Пытаться PostMessage вместо.

Другие вопросы по тегам