2011-02-23 107 views
6

如何知道鼠標點擊是否被模擬?當鼠標通過一個程序或真正的鼠標設備如何檢測鼠標點擊是合法還是自動?

點擊發送......我編程系統檢測的遊戲,以避免機器人,autoclicks等只接受合法的鼠標點擊

+11

忽略點擊。如果有另一個點擊,那麼它可能是一個真正的鼠標。忽略這一點,如果你點擊很多,你可以確定有一個憤怒的用戶試圖點擊.... – T33C 2011-02-23 13:59:01

+2

不可能。計算機以相同的方式解釋它們,這就是重點。否則,模擬鼠標事件不可能具有與真正的鼠標點擊相同的功能。毫無疑問,無論你嘗試實現什麼,都有更好的方法。 – 2011-02-23 14:17:05

+2

使用視網膜掃描器 – 2011-02-23 14:19:19

回答

0

我不知道有一種方法可以非常準確地確定鼠標點擊是否自動執行。我的意思是,您可以編寫自己的USB驅動程序,它位於本機鼠標驅動程序和操作系統之間,只向您傳遞「真正」點擊。但是,即使這樣做也可以通過插入USB設備(如智能手機)來解決,該USB設備被編程爲將USB數據包發送到主機。

你想要完成什麼,需要你區分真正的鼠標點擊和假的?

1

這個問題在細節上有點薄。

事件可以直接發送到控件,而無需移動鼠標,以便在獲得點擊事件時查找鼠標的位置,並查看它是否在控件上。鍵盤輸入需要控制焦點,因此請檢查。

對於鼠標移動的情況,您將無法確定是否記錄並回放了鼠標移動。如果它的腳本,那麼也許你可以監視控件的父面板中的鼠標行爲,並使用這些事件和動作來確定它是否是真實的。自動點擊可能會從無處出現,並導致一系列不太可能的懸停和焦點事件。

1

只有通過鼠標本身的一些專業硬件和軟件才能發送實際機械點擊的證據。通過軟件,這是不可能的。

0

通過在程序中記錄過去的X鼠標事件來創建統計學習解決方案。當用戶點擊該控件時,根據最後一次X操作確定其實際點擊的概率。

使用真正的點擊和各種各樣的自動化場景訓練您的解決方案。

這顯然不是一個保證工作的解決方案,並且比其他任何東西都更有趣。

10

這取決於您正在編寫的應用程序類型,但如果可以的話,我會觀察光標移動,而不是點擊。 人類的鼠標移動具有不均勻的速度,反應時間,不精確度(點擊按鈕的不同座標等)。

此外,您可以通過隨機要求難以編寫腳本的交互來防禦機器人。例如:如果腳本依賴於按鈕始終處於相同位置,我會確保在嘗試保持直觀的同時,每次都會彈出略微不同的位置對話框。

否則:無法檢測鼠標是真實還是真實模擬鼠標。 Windows HID/MacOS/Linux驅動程序層將小鼠,TrackPens,TrackBalls,繪圖板,觸摸屏...以及腳本鼠標之間的區別抽象化...

7

雖然博客文章本身是關於不同的問題,我提到你Raymond Chen的優秀Old New Thing。在這個特定的博客中,他談到的消息參數進入應用程序的有效性,也使得該點:

沒有意義,討論該消息的發送者是玩把戲和對你撒謊的可能性因爲(1)你的程序應該跟隨這個詭計並且對假菜單消息作出響應,就好像它們是真正的菜單消息一樣,因爲(2)無法說出你是否被騙了。爲了檢測說謊,你必須能夠讀入向你發送消息的程序員的心態。

從本質上講,您應該回應鼠標點擊作爲鼠標點擊,無論這些點擊如何生成。

1

雖然在我的其他答案中,我提到你應該只是將點擊作爲點擊作出響應,但有一種可能性,這取決於如何生成「編程」點擊。

我假設Windows平臺上,由於「vb.net」標籤:

隨着WinAPI的,你可以以模擬消息發送到任何窗口,例如WM_LBUTTONDOWN事件。在此消息中,您應該在按下按鈕時包含鼠標的X和Y位置 - 或者接收程序預期爲。處理消息時,可以使用GetCursorPos調用來獲取實際的光標位置。驗證消息中當前位置是接近,並將其作爲點擊處理,否則忽略它。

但請記住,消息隊列的性質可能需要一些時間來處理事件,並且鼠標可以在很短的時間內移動很長時間。

該解決方案只有在通過簡單的Send/PostMessage生成「click」時纔有效。如果生成點擊的應用程序也模擬鼠標的移動,那麼您應該可能會看到其他答案:)

+0

不幸的是,它會導致太多的誤報。消息滯後意味着沒有「親密」的門檻會表現良好。儘管如此,這是很好的食物。 – tenfour 2011-02-23 20:36:44

2

mouse keys模擬鼠標輸入還是合法?模擬鼠標輸入的目的是讓它們看起來完全像真正的鼠標輸入。 如果模擬正在完成其工作,那麼你的工作是不可能的。對不起,這是對你的軟件詛咒&。這裏有一些更不完美的想法:

  1. 使用GetKeyboardState並驗證按鈕狀態是正確的。如果郵件使用PostMessage,他們可能不會設置鍵盤狀態,這將表明fakery。
  2. 如果您的目標是正在進行輸入模擬的已知應用程序,請檢測它們並進行投訴。由於許多原因,這並不完美。
  3. 模糊邏輯,正如其他人所暗示的那樣。

你需要有創造性,想出一個模擬事件和一個真實的之間的區別,因爲沒有通用的答案。

0

它比你想象的要困難得多,因爲輸入宏程序產生合法鼠標和鍵盤輸入消息到你的遊戲。我不認爲有一種方法可以檢查輸入消息是否實際上是由物理硬件輸入(如鼠標或鍵盤)觸發的,除非操作系統爲您提供了輸入驅動程序級別的可訪問性。

由於這是專門針對遊戲的,所以您可以看到其他遊戲如何處理這種情況。一些常用的方法是,鼠標點擊的

  1. 檢查頻率。 (人類無法像點擊程序那樣快)

  2. 在隨機點或疑惑時,請使用CAPTCHA進行驗證。 (閱讀:http://www.threadmeters.com/v-1Vvd/CAPTCHA_The_Obvious_AntiBot_Solution/

  3. 使用外監控工具檢查在機器運行的所有進程,找出作弊的目的已知程序。蒸汽做到這一點。檢查Valve Anti-Cheat System暴雪的WoW也與Warden做同樣的事情。

我自己的建議是 「使用您的遊戲系統」。由於每款遊戲都有自己的規則和遊戲風格,因此不難發現玩家是否在作弊。這種方法不是一個通用的解決方案,它可能很愚蠢,但如果它適用於你的遊戲,爲什麼不呢? :)

1

它不能這樣做(可靠(單獨軟件反正))

我用WIN32API調用,讀取像素/操縱鼠標/發送鍵擊自動視頻遊戲和其他大部分重複的任務。你可以寫很多代碼來分析輸入,但同樣聰明的開發人員只是要修改他們的代碼來匹配。

當我第一次嘗試自動化鼠標點擊時,這就是我要做的。發送鼠標點擊。大多數情況下它都可以工作。您可能有跟蹤鼠標移動的代碼和整個鼠標事件堆棧,這些事件會隨着合法的點擊而觸發,並說'這不是真的 - 我們忽略它',但是沒有任何東西阻止開發人員實現鼠標移動。

鼠標事件比按鍵更復雜;但它基本上是一樣的想法。如果你編寫的代碼監視按鍵之間的時間,並確定我以每250毫秒的間隔向你的應用程序發送'2'鍵,你可能會認爲我是一個機器人。但是,我要做的就是修改我的代碼,以便在250ms內發送按鍵,並在-25和25毫秒之間選擇一個隨機值。

這是一個永無休止的貓和老鼠遊戲。最好的解決方案是使任務不重要,所以簡單的自動化形式不適用。