我正在嘗試編寫國際程序,需要發送一些文本到「其他文本編輯程序」,如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鍵寫下大寫字母
使用自動化API而不是僞造輸入 –
GetGUIThreadInfo()的文檔說:「請注意,在調用此函數之前,您必須將cbSize成員設置爲sizeof(GUITHREADINFO)。你沒有這樣做。當使用'SendInput()'時,你應該使用'KEYEVENTF_UNICODE'標誌,那麼你不必處理掃描碼和虛擬鍵。 –