2014-02-12 3 views
-2

Я пытаюсь открыть приложение через C# с помощью Process.Start(), а затем имитировать щелчок мышью по приложению.Как имитировать щелчок мышью по запущенному процессу

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

public partial class Form1 : Form 
{ 
    [DllImport("user32.dll", CharSet = CharSet.Auto, 
          CallingConvention = CallingConvention.StdCall)] 
    public static extern void mouse_event(uint dwFlags, int dx, int dy, 
              int dwData, int dwExtraInfo); 
    [DllImport("user32.dll")] 
    public static extern bool SetForegroundWindow(IntPtr hWnd); 

    private const int MOUSEEVENTF_ABSOLUTE = 0x8000; 
    private const int MOUSEEVENTF_LEFTDOWN = 0x0002; 
    private const int MOUSEEVENTF_LEFTUP = 0x0004; 
    private const int MOUSEEVENTF_MIDDLEDOWN = 0x0020; 
    private const int MOUSEEVENTF_MIDDLEUP = 0x0040; 
    private const int MOUSEEVENTF_MOVE = 0x0001; 
    private const int MOUSEEVENTF_RIGHTDOWN = 0x0008; 
    private const int MOUSEEVENTF_RIGHTUP = 0x0010; 
    private const int MOUSEEVENTF_WHEEL = 0x0800; 
    private const int MOUSEEVENTF_XDOWN = 0x0080; 
    private const int MOUSEEVENTF_XUP = 0x0100; 

    private void button1_Click(object sender, EventArgs e) 
    { 
     new Thread(() => 
     { 
      AddTextToListBox1(label1);    
     }).Start(); 
     new Thread(() => 
     { 
      // AddTextToListBox2(label2); 
     }).Start(); 
    } 

    private void AddTextToListBox1(Label label) 
    { 
     if (label1.InvokeRequired) 
     { 
      stringDelegate sd = new stringDelegate(AddTextToListBox1); 
      this.Invoke(sd, new object[] { label1 }); 
     } 
     else 
     { 
      label1.Text = this.ToString()+"Hi"; 
      System.Diagnostics.Process p = new System.Diagnostics.Process(); 
      p.StartInfo.FileName = "C://xyz//xyz.exe"; 
      p.Start(); 
      IntPtr hwnd = p.MainWindowHandle; 
     } 
    } 

    private void AddTextToListBox2(Label label) 
    { 
     if (label1.InvokeRequired) 
     { 
      stringDelegate sd = new stringDelegate(AddTextToListBox2); 
      this.Invoke(sd, new object[] { label1 }); 
     } 
     else 
     { 
      label2.Text = "done"; 
      Thread.Sleep(6000); 
      int X = 579; 
      int Y = 637; 
      mouse_event(MOUSEEVENTF_ABSOLUTE| MOUSEEVENTF_MOVE, X, Y, 0, 0); 
      mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, X, Y, 0, 0);    
     } 
    } 
+1

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

+0

прямо сейчас я просто хочу простой щелчок мыши. – Sarfaraz

+0

Почему вы не можете использовать UIAutomation? –

ответ

0

Я думаю, что mouse_event поднимет только событие в текущем приложении, потому что он не принимает hwnd на Params. Мой опыт в этой области очень низок, но я провел некоторое исследование. Посмотрите на функцию SendMessage.

MSDN article:

Посылает указанное сообщение в окно или окна. Функция SendMessage вызывает оконную процедуру для указанного окна и не возвращается до тех пор, пока оконная процедура не обработает сообщение.

Вы можете отправить большое количество сообщений с ним, в том числе события мыши

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