2014-01-17 28 views
0

我正在嘗試編寫國際程序,需要發送一些文本到「其他文本編輯程序」,如word或記事本或瀏覽器。在另一方面,我不知道我能找到一個國際性的方式(因爲不同的鍵盤佈局)用Delphi發送虛擬鍵碼的通用方法

這將是很好使用的代碼像下面

SendMessage(FindActiveWindowsHWND,WM_SETTEXT,0,Integer(PChar('My String'))); 

和我沒有之類的函數FindActiveWindowsHWND

編輯:我嘗試的代碼,但目前不滿意;

procedure FindActiveWindowsHWND(); 
var 
ThreadInfo: TGUIThreadInfo; 
activewindowsHwnd: HWND; 
begin 
    GetGUIThreadInfo(0,ThreadInfo); 
    activewindowsHwnd:= ThreadInfo.hwndActive; (or ThreadInfo.hwndFocus); 
end; 

也是我用Sendinput功能這樣

procedure SendKey(vKey: SmallInt; booDown: boolean); 
var 
    GInput: array[0..0] of tagINPUT; //GENERALINPUT; 
    // doesn't have to be array :) 
begin 
    GInput[0].Itype := INPUT_KEYBOARD; 
    GInput[0].ki.wVk := vKey; 
    GInput[0].ki.wScan := 0; 
    GInput[0].ki.time := 0; 
    GInput[0].ki.dwExtraInfo := 0; 

    if not booDown then 
    GInput[0].ki.dwFlags := KEYEVENTF_KEYUP 
    else 
    GInput[0].ki.dwFlags := 0; 

    SendInput(1, GInput[0], SizeOf(GInput)); 
end; 

然後

SendKey(65,true); //to send an "A" for example 

而是它發送的 「一」,當我嘗試發送 「A」 使用SendKey( 97,是)發送「1」。 它真的很有趣,我必須發送Shift鍵寫下大寫字母

+1

使用自動化API而不是僞造輸入 –

+0

GetGUIThreadInfo()的文檔說:「請注意,在調用此函數之前,您必須將cbSize成員設置爲sizeof(GUITHREADINFO)。你沒有這樣做。當使用'SendInput()'時,你應該使用'KEYEVENTF_UNICODE'標誌,那麼你不必處理掃描碼和虛擬鍵。 –

回答

1

您可以使用GetGUIThreadInfo()獲得當前聚焦窗口在另一個進程中的HWND。不過,並非所有窗口類型都接受WM_SETTEXT。不過,您可以使用SendInput()將Unicode字符放入鍵盤隊列中。或者像David說的那樣使用Automation API,儘管並非所有的窗口類型都實現了這一點。

+0

以前從未見過'GetGUIThreadInfo'。很高興知道。謝謝! – TLama

+0

這將是很好的學習什麼是自動化api :) – user3057015

+0

另一件事我無法使用getguiThreadInfo()funciton獲取活動窗口的HWND。你可以給我一個例子嗎? – user3057015