2012-11-30 155 views
1

可能重複:
How to simulate Mouse Click in C#?使用後/ SendMessage函數做鼠標點擊不工作

我已經試過

Window = FindWindow(null, "untitled - Paint"); 
PostMessage(WindowToFind, WM_MOUSEMOVE, 0, location); 
PostMessage(WindowToFind, WM_LBUTTONDOWN, ((int)Keys.LButton), location); 

位置100 * 0x10000 + 100100x100等我懷疑這是不對的。我試過換((int)Keys.LButton)0,沒有工作。我試着在lbuttondownlbuttonup之間插入thread.sleep(well postmessage應該等待沒有thread.sleep但是無論如何)我使用0x0200爲鼠標移動,0x0202爲左按鈕常量。

不知道爲什麼它根本不起作用。

+2

你嘗試過嗎? http://stackoverflow.com/questions/2416748/how-to-simulate-mouse-click-in-c –

+0

需要窗口在前面,並實際點擊。即時通訊試圖模擬它。 (我剛剛閱讀代碼,沒有看到任何窗口的東西,所以我可能是不正確的)仍然,謝謝。 –

回答

3

這是正確的。 The PostMessage and SendMessage functions were never intended to synthesize mouse (or keyboard) events。他們可能有時會這樣做,但它不是你應該依靠的,因爲大部分時間他們將無法工作。

相反,您應該使用SendInput function來正確合成鼠標事件。與其他Win32 API函數一樣,您需要P/Invoke才能從C#調用它。這個定義可以從文檔手動生成,或者很容易找到​​。唯一棘手的部分是你需要聲明合適的結構以及函數本身。

mouse_event function也存在除了SendInput的方式來合成鼠標事件,但作爲鏈接的文件表明,這個功能已經支持SendInput廢棄。您應該始終喜歡在新應用程序中使用SendInput

唯一的問題是您似乎試圖將這些鼠標事件發送到不同的應用程序。這會造成一些問題,因爲SendInput只是將事件注入到鍵盤/鼠標流中。處理它們的應用程序將成爲前景窗口的應用程序。因此,您需要先將焦點設置到其他窗口,並確保您不會與UIPI發生衝突。

但是,在另一個級別上,您擁有的代碼相對比較脆弱:只要使用不同的名稱保存文檔,畫圖窗口就會更改它們的名稱。並且假定Windows 9不會將Paint重命名爲其他內容 - 之前發生過,該應用曾被稱爲「Paintbrush」。希望這只是您嘗試完成的一些示例。無論如何,我可能會建議您查看更強大的自動化方法(例如,Microsoft UI Automation框架),而不是盲目注入輸入。

+0

啊,我只是試着用油漆。 sendinput似乎需要重點,抱歉,如果我誤解了。你能否詳細說明「強大的自動化方法」? 「ui自動化」似乎是不相關的,因爲我讀了它對ui的自動修改? –