2015-04-01 2 views
0

Я унаследовал какой-то довольно навязчивый «экранный скребок» на работе. Кажется, что все работает отлично, ИСКЛЮЧАЮТ на некоторых машинах Windows XP, где события кликов никогда не попадают на кнопку, которую мы хотим программно «щелкнуть».SendMessage vs SendNotifyMessage в user32.dll api

Следующий фрагмент используется в различных частях нашего кода, чтобы «щелкнуть» кнопку.

[DllImport("user32.dll")] 
    public extern static int SendMessage(IntPtr hwnd, uint msg, uint wParam, uint lParam); 
    [DllImport("user32.dll")] 
    public extern static int SendNotifyMessage(IntPtr hwnd, uint msg, uint wParam, uint lParam); 
    static public void SendClick(SystemWindow w, bool WAIT = true, int delay=100) 
    { 
     if (w != null) 
      if (WAIT == true) 
       SendMessage(w.HWnd, 0x00F5, 0, 0); 
      else 
      { 
       SendNotifyMessage(w.HWnd, 0x00F5, 0, 0); 
       System.Threading.Thread.Sleep(delay); 
      } 
    } 

Что меня смущает разница между SendMessage и SendNotifyMessage. Любая идея, почему вы захотите один за другим?

+2

SendMessage блокирует до тех пор, пока сообщение не будет обработано; SendNotifyMessage немедленно возвращается (если только окно не принадлежит к тому же потоку). – Blorgbeard

+0

Также посмотрите ['SendMessageTimeout()'] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms644952.aspx). –

+1

@Benju: вы подтвердили, что 'SystemWindow w' является правильным окном для кнопки и что' w.HWnd' действительно? Каково значение возврата «Отправить (Уведомлять) Сообщение()», когда кнопка не отвечает? Происходит ли ошибка только тогда, когда 'WAIT' является либо истинным, либо ложным, или это происходит для обоих? Вы пробовали использовать Spy ++ или аналогичный инструмент для мониторинга оконных сообщений и убедитесь, что ваше сообщение (которое является ['BM_CLICK'] (https://msdn.microsoft.com/en-us/library/windows/desktop/bb775985.aspx) - не жестко кодировать его числовое значение) достигает кнопки? –

ответ

2

0x00F5BM_CLICK. Его документация содержит следующее примечание:

Если кнопка находится в диалоговом окне и диалоговое окно не является активным, сообщение BM_CLICK может потерпеть неудачу. Чтобы обеспечить успех в этой ситуации, вызовите функцию SetActiveWindow, чтобы активировать диалоговое окно, прежде чем отправлять сообщение BM_CLICK на кнопку.