2013-07-19 50 views
5

Tôi có một dự án liên quan đến việc mở nhiều ứng dụng khách sổ và sau đó mô phỏng các lần nhấp chuột trong mỗi quy trình đó. Tôi đã có thể gửi tin nhắn thành công tới nhiều phiên bản của Notepad bằng cách sử dụng API Win32 và SendMessage. Mã hoạt động cho tôi như sau:Chuột tự động hóa web Nhấp vào

Process[] notepads = Process.GetProcessesByName("notepad"); 
      foreach (Process proc in notepads) 
      { 
        IntPtr handle = proc.Handle; 
        IntPtr child = FindWindowEx(proc.MainWindowHandle, new IntPtr(0), "Edit", null); 
        if (child != null) 
        { 
         MessageBox.Show("Child was found, sending text"); 
         SendMessage(child, 0x000C, 0, "test"); 
        } 
       } 
      } 

Điều này gửi "kiểm tra" cho mọi trường hợp tôi đã mở trong Notepad, cho dù có bao nhiêu. Như bạn có thể thấy tôi đang lặp qua tất cả các trường hợp của một quá trình, và chỉ đơn giản là lặp lại thông báo. Không khó chút nào ...

Mục tiêu cuối cùng không phải là Notepad, thay vì phần mở rộng Awesomium của Microsoft. Tôi lấy ra cửa sổ xử lý, và sau đó là tên lớp con (Awesomium), đó là Chrome_RenderWidgetHostHWND. Từ đó, tôi đã cố gắng gửi các sự kiện chuột bằng cách tái cấu trúc các kiểu biến trong Sendmessage để lắp ráp và lParam có thể đọc được bởi hệ thống. Dưới đây là mã:

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] 
     static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); 

Sử dụng một số ví dụ tôi thấy tôi lắp ráp các lParam qua này:

int x = 834; 
int y = 493; 
IntPtr lParam = (IntPtr)((y << 16) | x); 
IntPtr wParam = IntPtr.Zero; 

Tôi đang sử dụng các móc Chuột toàn cầu để phát hiện các sự kiện báo chí tại tất cả các cửa sổ con, và khi tôi nhấn nút của tôi để lặp qua quá trình và nhấp vào, không có gì được gửi cả. Tôi biết tôi đang làm một cái gì đó ngu ngốc ở đây gây ra các nhấp chuột không được gửi đi. Trong mọi trường hợp, đây là cấu trúc mã cuối cùng mà tôi có. Bất kỳ lời khuyên, hoặc lời khuyên sẽ được đánh giá cao. Cảm ơn.

private void button2_Click(object sender, EventArgs e) 
    { 
     Process[] notepads = Process.GetProcessesByName("client"); 
     foreach (Process proc in notepads) 
     { 
       IntPtr handle = proc.Handle; 
       string mine = Convert.ToString(proc); 
       MessageBox.Show(mine); 
       IntPtr child = FindWindowEx(proc.MainWindowHandle, new IntPtr(0), "Chrome_RenderWidgetHostHWND", null); 
       if (child != null) 
       { 
       int x = 834; 
       int y = 493; 
       IntPtr lParam = (IntPtr)((y << 16) | x); 
       IntPtr wParam = IntPtr.Zero; 
       SendMessage(child, 0x201, wParam, lParam); 
       SendMessage(child, 0x202, wParam, lParam); 
       } 
      } 
     } 
+0

Nhận ra một số lỗi với mã của tôi, cuối cùng tôi đã đào sâu vào WinInspector và truy xuất tất cả các lệnh cần thiết để kích hoạt một cú click chuột. Tôi là một noob. Đối với bất kỳ ai trong tương lai, dưới đây là các thông báo cần thiết để kích hoạt một nhấp chuột trên Awesomium bằng Win32, rất có thể nó giống nhau cho tất cả. WM_PARENTNOTIFY, WM_MOUSEACVTIVATE, WM_LBUTTONDOWN. Loạt ba lệnh này sẽ thông báo cho phụ huynh rằng người dùng đã kích hoạt chuột, sau đó nó thực hiện một hittest ngắn gọn, sau đó cuối cùng sẽ nhấn nút trái. Hy vọng điều này sẽ giúp một ai đó. – user2578424

+3

Bạn nên trả lời và sau đó chấp nhận nó. – Xcelled194

Trả lời

1

Hoặc bạn có thể sử dụng SendInput thay vào đó, sẽ hoạt động chính xác khi có móc chuột; giải pháp của bạn (đăng bài viết trực tiếp) sẽ không.

Quan trọng hơn, nếu quá trình từ chối kích hoạt (nghĩa là nếu mục tiêu trả về 0 từ WM_MOUSEACTIVATE), WM_LBUTTONDOWN sẽ không được gửi.

Các vấn đề liên quan