2013-07-19 104 views
5

我有一個項目,涉及打開多個窗口客戶端,然後在每個進程中模擬鼠標點擊。我已經能夠使用Win32 API和SendMessage成功地將消息發送到記事本的多個實例。這對我的作品的代碼如下:網頁自動化鼠標點擊

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"); 
        } 
       } 
      } 

這發出「測試」每次我都打開記事本,例如無論有多少。正如你所看到的,我遍歷一個進程的每個實例,並簡單地循環消息。並不難...

最終目標不是記事本,而是微軟的擴展Awesomium。我檢索了窗口句柄,然後是子類(Awesomium)類名,它是Chrome_RenderWidgetHostHWND。從那裏,我嘗試通過重構Sendmessage中的變量類型來發送鼠標事件,以便組裝和lParam可讀的系統。下面是該代碼:

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

使用一些例子,我發現我通過這種組裝的lParam:

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

我現在用的是全局鼠標鉤子,以檢測所有子窗口按下事件,當我點擊我的按鈕來遍歷整個過程並點擊,根本沒有任何東西被髮送。我知道我在這裏做了一些愚蠢的事情,導致不能發送鼠標點擊。無論如何,這裏是我的最終代碼結構。任何意見,或提示將不勝感激。謝謝。

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

通過我的代碼實現了一些缺陷,我終於深入到WinInspector並檢索了啓動鼠標點擊所需的所有命令。我是一個小菜鳥。 對於將來的任何人,下面是使用Win32激活點擊Awesomium所需的消息,很可能它對所有人都是一樣的。 WM_PARENTNOTIFY,WM_MOUSEACVTIVATE,WM_LBUTTONDOWN。這三個命令的系列將通知父母,用戶已激活鼠標,然後執行一個簡短的命中,然後最終按下左鍵。希望這可以幫助某人。 – user2578424

+3

你應該回答並接受它。 – Xcelled194

回答

1

或者你可以使用SendInput代替,這將在鼠標鉤子的存在正常工作;您的解決方案(直接發佈消息)不會。

更重要的是,如果進程拒絕激活(即,如果目標從WM_MOUSEACTIVATE返回0),則不會發送WM_LBUTTONDOWN。