我有一個項目,涉及打開多個窗口客戶端,然後在每個進程中模擬鼠標點擊。我已經能夠使用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);
}
}
}
通過我的代碼實現了一些缺陷,我終於深入到WinInspector並檢索了啓動鼠標點擊所需的所有命令。我是一個小菜鳥。 對於將來的任何人,下面是使用Win32激活點擊Awesomium所需的消息,很可能它對所有人都是一樣的。 WM_PARENTNOTIFY,WM_MOUSEACVTIVATE,WM_LBUTTONDOWN。這三個命令的系列將通知父母,用戶已激活鼠標,然後執行一個簡短的命中,然後最終按下左鍵。希望這可以幫助某人。 – user2578424
你應該回答並接受它。 – Xcelled194