Отправить эмулированные события в другое окно - PullRequest
1 голос
/ 11 января 2011

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

using System.Runtime.InteropServices;
using System.Diagnostics;



namespace WpfApplication1
{

  public partial class MainWindow : Window
  {


    [DllImport("user32.dll")]
    private static extern int SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);


    private const int downclick = 0x201;
    private const int upclick = 0x202;
    IntPtr handle = IntPtr.Zero;

    public MainWindow()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
      foreach (Process p in Process.GetProcessesByName("mspaint"))
      {
        IntPtr handle = p.MainWindowHandle;
        int X = 50;
        int Y = 380;
        IntPtr lParam = (IntPtr)((Y << 16) | X);
        IntPtr wParam = IntPtr.Zero;
        SendMessage(handle, downclick, wParam, lParam);
        SendMessage(handle, upclick, wParam, lParam);
      }  
    } 
  }
}

Используя Spy ++, я вижу, что приложение получает следующие данные:

<00062> 0004052C S WM_LBUTTONDOWN fwKeys:0000 xPos:50 yPos:380
<00063> 0004052C R WM_LBUTTONDOWN
<00064> 0004052C S WM_LBUTTONUP fwKeys:0000 xPos:50 yPos:380
<00065> 0004052C R WM_LBUTTONUP

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

Возможно ли это вообще?

1 Ответ

1 голос
/ 11 января 2011

Нет, это невозможно каким-либо надежным способом - как вы узнали в ходе тестирования.Сообщения мыши - только одна часть ввода.Windows сохраняет состояние ввода, и просто отправка сообщений не будет обновлять это состояние ввода.Кроме того, вы игнорируете сообщения о перемещении мыши и т. Д.

Например, в приложении WinForms вы можете использовать свойство MousePosition для получения текущего положения мыши.Отправка сообщений не может имитировать это.

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

Так что, возможно, это будет работать, если приложение будет прослушивать только сообщения мыши, это будет работать, но если нет, то не будет.

Они поддерживали способ имитации щелчков мыши, это SendInput функция.Но это не будет работать с свернутыми приложениями.Он буквально проходит весь процесс ввода Windows и будет перемещать курсор мыши - это означает, что приложение должно быть видно на экране.

Вот некоторая информация, она говорит о событиях клавиатуры, но применяется аналогичная логика:http://blogs.msdn.com/b/oldnewthing/archive/2005/05/30/423202.aspx http://blogs.msdn.com/b/oldnewthing/archive/2010/12/21/10107494.aspx

...