2013-09-20 3 views
4

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

Контекст

У меня есть приложение, которое очень полезно для меня, но человек, который разработал его не думать обо всем. В какой-то момент в приложении открывается диалоговое окно с просьбой подтвердить замену существующих данных загруженными данными. Мне нужно нажать OK, чтобы согласиться, но проблема в том, что я загружаю много данных в это приложение, и у него нет флажка «применимо ко всем». Поэтому я должен нажать OK неоднократно. Поэтому я работаю над приложением, которое будет нажимать кнопку OK, пока не исчезнет диалог.

Код

код нажать кнопку один раз (это работает) ...

private void btnOKloop_Click(object sender, System.EventArgs e) 
{ 
    int hwnd=0; 
    IntPtr hwndChild = IntPtr.Zero; 

    //Get a handle for the Application main window 
    hwnd = FindWindow(null, "Desired MessageBox"); 

    hwndChild = FindWindowEx((IntPtr)hwnd, IntPtr.Zero, "Button", "OK"); 

    //send system message 
    if (hwnd != 0) 
    { 
     SendMessage((int)hwndChild, BN_CLICKED, 0, IntPtr.Zero); 
    } 
    else 
    { 
     MessageBox.Show("Button Could Not Be Found!", "Warning", MessageBoxButtons.OK); 
    } 

} 

код, чтобы нажать на кнопку в цикле (это висит) ...

private void btnOKloop_Click(object sender, System.EventArgs e) 
{ 
    int hwnd=0; 
    IntPtr hwndChild = IntPtr.Zero; 

    hwnd = FindWindow(null, "Desired MessageBox"); 

    hwndChild = FindWindowEx((IntPtr)hwnd, IntPtr.Zero, "Button", "OK"); 

    do 
    { 
     SendMessage((int)hwndChild, BN_CLICKED, 0, IntPtr.Zero); 
    } while (hwnd != 0); 
+0

Парни, пожалуйста, кто-нибудь? Я уверен, что это очень просто, но я пробовал много сотрудников, и ничто из этого не работает, приложение зависает и все. Также я искал в Интернете и использовал поиск в Stackoverflow, безуспешный !!!!! ПОЖАЛУЙСТА!!!! – o0Lucky0o

+0

Ваш вопрос не очень ясен. Вы говорите, что как только вы нажмете кнопку, чтобы запустить цикл, зависает ваше приложение, возможно, это потому, что этот цикл работает в потоке пользовательского интерфейса? Пожалуйста, будьте более конкретными и опубликуйте код, который действительно дает вам проблемы. – Alberto

+0

Ваше приложение кажется зависающим, потому что оно работает через цикл, неоднократно вызывая 'SendMessage'. Возможно, вы должны изменить свой код, чтобы запустить цикл в другом потоке, или отправлять периодические сообщения на основе таймера, а не циклически. –

ответ

1

Ваша петля никогда не будет выходить:

hwnd = FindWindow(null, "Desired MessageBox"); 

hwndChild = FindWindowEx((IntPtr)hwnd, IntPtr.Zero, "Button", "OK"); 

do 
{ 
    SendMessage((int)hwndChild, BN_CLICKED, 0, IntPtr.Zero); 
} while (hwnd != 0); 

Вы установили переменную hwnd за пределы цикла, а затем зациклируете до тех пор, пока значение не изменится на 0. Но поскольку вы не устанавливаете значение в своем цикле, оно будет никогда изменить. Вы можете быть в состоянии исправить это, просто перемещая операторы присваивания переменных в вашей петле:

do 
{ 
    hwnd = FindWindow(null, "Desired MessageBox"); 
    if (hwnd != 0) { 
     hwndChild = FindWindowEx((IntPtr)hwnd, IntPtr.Zero, "Button", "OK"); 
     SendMessage((int)hwndChild, BN_CLICKED, 0, IntPtr.Zero); 
    } 
} while (hwnd != 0); 

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

do 
{ 
    hwnd = FindWindow(null, "Desired MessageBox"); 
    if (hwnd != 0) { 
     hwndChild = FindWindowEx((IntPtr)hwnd, IntPtr.Zero, "Button", "OK"); 
     SendMessage((int)hwndChild, BN_CLICKED, 0, IntPtr.Zero); 
    } 
    System.Threading.Thread.Sleep(250); // 250 milliseconds: 0.25 seconds between clicks. 
} while (hwnd != 0); 
+0

Спасибо за предложение, я обязательно попробую его и вернусь с результатами, спасибо еще раз. – o0Lucky0o

+1

Спасибо, что он работает !!!! Но теперь мне нужно выяснить, как добавить кнопку, чтобы остановить цикл, вручную, также случается странная вещь, приложение работает, но через несколько секунд оно говорит, что мое приложение «Loop» не отвечает, но оно крадет работает, не могли бы вы знаете, что это вызывает? Это потому, что я не использую фоновых работников ??? Спасибо – o0Lucky0o

+0

@ o0Lucky0o - Если у вас есть дополнительные вопросы, убедитесь, что вы сделали свою должную осмотрительность (немного исследовали ее), а затем задайте новый вопрос. Задавать новые вопросы в комментариях нецелесообразно для будущих посетителей. – JDB

Смежные вопросы