2017-01-03 56 views
1

我的問題是下面的過程,顯示這個字符串'a-bb-ccc-dddd'在outpot中像這樣'a-b-c-d'。 我該如何解決它。在delphi中使用發送輸入的重複字符集

procedure SendText(const Value: WideString); 
var 
    i: Integer; 
    S: WideString; 
    TI, TYY222: TInput; 
    ki: TKeybdInput; 
    MyWND: HWND; 
const 
    KEYEVENTF_UNICODE = $0004; 
begin 
    S := (Value); 
    TI.Itype := INPUT_KEYBOARD; 
    for i := 1 to Length(S) do 
    begin 
    ki.wVk := 0; 
    ki.dwFlags := KEYEVENTF_UNICODE; 
    ki.wScan := Ord(S[i]); 
    TI.ki := ki; 
    SendInput(1, TI, SizeOf(TI)); 
    end; 
end; 

回答

4

以這種方式在循環中多次調用SendInput總是一個錯誤。 SendInput的整個要點是它分批處理一系列相關的輸入事件,並將它們作爲原子組發送。這在SendInput的文檔中有相當明確的說明,我建議您重新閱讀它。

因此,首先要改變的是使用你的循環來建立一個輸入事件數組,然後在你的循環完成後,通過一個簡單的調用SendInput來發送這個數組。

另一個問題是,您的代碼目前僞造關鍵事件,但忽略僞造關鍵事件。你鍵入的每個字符都包含關鍵字,然後再回來。所以,你的數組的大小需要包含字符串中字符的兩倍。對於每個角色,你需要包括關鍵和關鍵。在dwFlags中包含KEYEVENTF_KEYUP以表示關鍵事件。

我能看到的另一個問題是您正在使用未初始化的變量。你設置了一些但不是全部的字段ki。你需要確保整個記錄被初始化。

您似乎沒有理由製作輸入字符串的副本。您可以直接使用輸入字符串。從複製它沒有什麼可以獲得。

最後,您是否考慮使用UI自動化而不是僞造輸入?

+0

謝謝,是的,我用UI自動化。我發現這個示例[鏈接](http://stackoverflow.com/questions/25823685/sendinput-not-working-in-certain-apps-windows-with-delphi),但它不知道爲什麼它dos'nt工作對我來說 –

+2

我覺得有點驚訝,你犯了與問題提問者完全相同的錯誤,並且你忽略了答案中的代碼。 –

+0

這是因爲在我問這個問題之前,測試了你對這個問題的回答。但我收到了多個錯誤。你確定你的答案在這個問題上有什麼錯誤嗎? –

相關問題