2013-10-15 43 views
-1

有一個遊戲,我試圖自動化一些行動。應用程序塊可以調用SendInput嗎?

我以前用過SendInput很成功。但是,在這個應用程序中,我無法點擊鼠標來工作。我已經使用其他應用程序對其進行了測試,並且它們都按預期工作

應用程序可以阻止我使用SendInput嗎?如果是這樣,我能以某種方式避開它嗎?

附註:我正在用C#編寫代碼,並在Windows 7 x64上運行。我試圖與之交互的應用程序是x86。我不知道這是否有所作爲?我測試了與x64和x86應用程序交互的代碼。

回答

1

簡短的回答:沒有。(不調用SendInput,但輸入可以過濾參見下面的更新。)

如果你看看參數SendInput沒有任何標識的過程。輸入發送到系統,而不是應用程序。應用程序無法區分真實和合成輸入的區別。

應用程序不響應合成輸入的原因有很多。如SendInput的文檔中所述,此API受UIPI約束。運行在比調用SendInput的應用程序更高的完整性級別的應用程序將不會收到此輸入。

儘管SendInput在低於DirectInput運行的級別注入輸入,但DirectInput顯然更容易出錯代碼。請參閱Simulating Keyboard with SendInput API in DirectInput applications以供參考。


更新(2016年5月1日):
除了與UIPI問題,防止到達一個應用程序的輸入,但也可以爲一個低級別的鍵盤/鼠標鉤子來識別輸入注入。兩者 KBDLLHOOKSTRUCT(傳遞給 LowLevelKeyboardProc回調)以及所述 MSLLHOOKSTRUCT(傳遞給 LowLevelMouseProc回調)含有 標誌構件,即具有 LLKHF_INJECTEDLLMHF_INJECTED標誌設置,在情況下,輸入被注入。

因此,應用程序可以安裝低級別的鍵盤/鼠標鉤子以過濾掉注入的消息。如果是這種情況,潛在的解決方法是(在不寫驅動程序的情況下),在之後安裝一個低級別的鍵盤/鼠標鉤,並且通過不調用CallNextHookEx來防止輸入到達應用程序的鉤子(鉤子是按照相反的順序調用它們,從最後到第一次)。

注意:解決方法是故意短路已安裝的掛鉤,從而可能會破壞其他應用程序。另外,如果一個應用程序決定實現一個低級別的鉤子來過濾注入的輸入,它可能會通過頻繁地將自身重新安裝到鉤子鏈的頂部來防止競爭性的低級鉤子,這使得解決方法變得毫無用處。

+0

感謝您的回覆。我假設如果我以管理員身份運行,那麼會繞過任何UIPI問題?如果是這樣的話,那麼我可以打折。 –

相關問題