2017-07-14 27 views
0

我正在嘗試使用SendInput來自動化一些擊鍵。在簡單的測試中(即打開記事本和看筆畫發生),筆畫工作正常。模擬空間作品一遍又一遍,字母等什麼會導致SendInput在每個密鑰實例之後停止工作?

但是,當試圖將此輸入發送到某個應用程序時,SendInput僅適用於某個鍵的第一個實例。因此,我可以發送一次空間,並且下次嘗試發送空間時,它不會實際發送。 (即使它會在任何其他應用程序中發送)然後我可以發送一次A,但下次嘗試發送A時它不會發送。等等。

這是我遇到的某種權限問題或什麼的?初始輸入工作得很好,但按下相同的按鍵則不行。

爲了提供更多的物質,下面是一個例子方法,假設所有的標準結構:

public static void PressEnter() 
    { 
     INPUT[] Inputs = new INPUT[1]; 
     INPUT Input = new INPUT(); 

     Input.type = 1; // 1 = Keyboard Input 
     Input.U.ki.wScan = ScanCodeShort.RETURN; 
     Input.U.ki.dwFlags = KEYEVENTF.SCANCODE; 
     Inputs[0] = Input; 

     uint returnInput = SendInput(1, Inputs, INPUT.Size); 

     Console.WriteLine(returnInput); 
    } 

我可以用記事本集中一遍又一遍重複這一點,回報將持續進行。但是,將這些反覆發送給這個特定的應用程序時,只有第一個通過。但是,我可以在我的鍵盤上按Enter鍵並且它可以被接受。應用程序是否可以拒絕來自SendInput的輸入?

+0

您嘗試向哪個應用程序發送擊鍵? – spender

+0

該應用程序是一個複雜的記錄保存軟件,我正在努力實現自動化(不是我的地方去替換它),並且認爲這將是一個簡單的任務,因爲我過去曾與SendInput一起工作過,但後來我遇到了這個。 – Branden

+0

當你發送空間,然後A,然後空間時會發生什麼?它會第二次發送空間 –

回答

0

這裏有一種方法來模擬KEYUP標誌

INPUT input[4]; 

input[0].type = INPUT_KEYBOARD; 
input[0].ki.wVk = 0; 
input[0].ki.wScan = ScanCodeShort.RETURN; 
input[0].ki.dwFlags = 0; 

input[1].type = INPUT_KEYBOARD; 
input[1].ki.wVk = 0; 
input[1].ki.wScan = ScanCodeShort.RETURN; 
input[1].ki.dwFlags = KEYEVENTF_KEYUP; 

input[2].type = INPUT_KEYBOARD; 
input[2].ki.wVk = 0; 
input[2].ki.wScan = ScanCodeShort.RETURN; 
input[2].ki.dwFlags = 0; 

input[3].type = INPUT_KEYBOARD; 
input[3].ki.wVk = 0; 
input[3].ki.wScan = ScanCodeShort.RETURN; 
input[3].ki.dwFlags = KEYEVENTF_KEYUP; 

SendInput(4, input, sizeof(INPUT)); 

INPUT_KEYBOARD是輸入

KEYEVENTF_KEYUP將模擬KEYUP

通過這種方式,你可以發送多個按鍵。試試吧,希望這可能適合你。

+0

您確實是對的,我從來沒有模擬過一個keyup,所以我猜應用程序被卡住了。添加第二個輸入模擬鍵盤後,所有內容都可以正常工作。感謝您指點我正確的方向。 – Branden

+0

偉大的你得到它的工作! :) –

相關問題