2009-06-18 45 views
0

我編寫了一個程序,在計劃時間使用Win32自動點擊應用程序,使用MOUSE_DOWNMOUSE_UP。它通常運作良好,除了我發現,我需要把在如何準確編程Windows上的自動「點擊」?

sleep 0.1 

MOUSE_DOWNMOUSE_UP之間。 (使用Ruby,允許睡眠幾分之一秒)。

沒有睡眠,有時點擊不會通過。但我注意到,有時點擊太長了。點擊實際上是在Flash應用的右箭頭上。這個右箭頭將轉到列表中的下一個項目。所以如果你再延長一段時間MOUSE_DOWN,它實際上會移動2或3個項目而不是1個項目。

所以我想知道,在這種情況下,有沒有一種方法可以精確模擬1次點擊。可能沒有MOUSE_CLICK事件?它必須使用MOUSE_DOWNMOUSE_UP來模擬?

(它實際上是調用Win32上MOUSEEVENTF_LEFTDOWNMOUSEEVENTF_LEFTUP,只是爲了簡單起見,表示爲MOUSE_DOWN代替。)

+4

因爲你卻把[Perl的]標籤,我要問哪一部分我的回答您以前對這個問題並沒有解決你的問題:http://stackoverflow.com/questions/ 1007391/using-perl-python-or-ruby-how-to-write-a-program-to-click-on-the-screen-at-s/1009497#1009497 – 2009-06-18 12:56:28

+0

我開始使用Win32:GUI,但它需要一些更多的安裝,所以我開始研究Ruby。 Win32:GuiTest也需要安裝嗎?如果是點擊,那可能會更好。它是否通過使用時間戳發送點擊作爲MOUSE_DOWN和MOUSE_UP一定的時間間隔? – 2009-06-18 13:26:25

+0

@Jin Lin看着源代碼,它似乎發送一個鼠標按下事件,緊接着鼠標事件(在相同的位置),之間沒有任何延遲。當我對延遲發表評論時,我猜想我正在考慮雙擊。 Win32 :: GuiTest也需要安裝。 – 2009-06-18 14:08:08

回答

3

您不會決定鼠標放下和鼠標移動之間的延遲設置是否會導致操作系統進行有效的單擊。

sleep功能可以保證你想要的鼠標下降和鼠標上移事件之間的時間。 Perl的Win32::GuiTest模塊允許你發送一個實際的點擊事件,而不是混淆向下和向上事件的時間。 後來:查看源代碼,Win32的:: GuiTest似乎只是火鼠標向下和向上事件沒有任何延遲它們之間see GuiTest.pm

elsif ($item =~ /leftclick/i) { 
    SendLButtonDown(); 
    SendLButtonUp(); 
} 

此外,http://msdn.microsoft.com/en-us/library/ms646260(VS.85).aspx指出mouse_event已被SendInputhttp://msdn.microsoft.com/en-us/library/ms646310(VS.85).aspx取代它允許你發送MOUSEINPUT事件與時間戳等

+0

確實Flash應用仍然可以通過點擊比平常更長時間並移動2項內容? – 2009-06-18 13:27:37

3

如果你不綁定到特定的語言,你可以看看AutoIt它是由特別是對於這樣的事情。 我有很好的體驗,用於自動化鼠標點擊或擊鍵等操作。

1

你用什麼函數來實現這個功能?

我期望SendInput在MOUSEINPUT結構中傳遞一個2的鏈(一個按鈕向下,另一個按鈕向上)會爲您解決這個問題。你甚至可以用僞造事件上的時間戳來玩遊戲,以達到比睡眠時更確定的行爲()。

沒有CLICK發送,因爲它是應用程序將崩潰低級事件(鼠標移動,按鈕向下,按鈕向上,按下,鍵入等)轉換爲「用戶級別」事件的責任。


一些代碼,澄清。這是直接的未經測試/編譯C(閱讀:C的壞種類),但我希望它能說明我的觀點。

LPINPUT events = (LPINPUT)malloc(sizeof(INPUT) * 2); 

events[0].type = INPUT_MOUSE; 
events[0].mi.dwFlags = MOUSEEVENTF_LEFTDOWN; 
events[0].mi.time = 0; //Here, you can play with timestamps (milliseconds) 
events[1].type = INPUT_MOUSE; 
events[1].mi.dwFlags = MOUSEEVENTF_LEFTUP; 
events[1].mi.time = 0; //Likewise 

//Push both events into the event queue 
SendInput(2, events, sizeof(INPUT)); 

我沒有Ruby的經驗,所以我不知道你會如何互動這個你的情況。

+0

我正在使用mouse_event = user32'mouse_event',['L','L','L','L','L'],'V',然後mouse_event.call MOUSEEVENTF_LEFTDOWN,0,0,0,0發送活動...我如何玩時間戳而不是使用睡眠? – 2009-06-18 10:24:27

+0

增加了一些代碼來說明我會如何嘗試在C中做到這一點。它完全未經測試,但希望有所幫助。 – 2009-06-19 00:04:37

1

我想兩兩件事:

  1. 我敢打賭,紅寶石不會,也不能保證睡眠0.1真的睡僅爲0.1秒。由於這是大概是出於RUBYS控制和OS控制
  2. 通過的Win32本身對Win32 API的調用可能需要任意時間,導致延遲
1

由於Windows API的支持睡覺下降到1毫秒,爲什麼不只是睡更短的時間? 0.01秒應該夠了?

+0

我想我已經看到0.01可能不會註冊爲點擊的情況......但我可以嘗試更多 – 2009-06-18 10:12:54

1

我會使用AutoHotKey。它是開放源碼和免費的,已經存在了很長時間並得到積極維護,以至於其他人已經爲它構建了一個IDE。我用它來爲表單測試生成獨特的隨機測試數據,但它也是鼠標的東西。

http://www.autohotkey.com/