我正在尝试编写国际程序,需要将一些文本发送到“其他文本编辑程序”,如word或记事本或浏览器。另一方面,我不确定我能找到一种国际化的方式(因为键盘布局不同)
使用下面的代码
会很不错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,true)发送“a”时,它发送了“1”。 非常有趣的是我必须将shift键发送到写大写字母
答案 0 :(得分:1)
您可以使用GetGUIThreadInfo()
在另一个进程中获取当前焦点窗口的HWND。但是,并非所有窗口类型都接受WM_SETTEXT
。但是,您可以使用SendInput()
将Unicode字符放入键盘队列中。或者像David所说的那样使用Automation API,但并非所有窗口类型都实现了这一点。