使用Delphi发送虚拟密钥代码的通用方法

时间:2014-01-17 21:00:21

标签: delphi internationalization keystrokes

我正在尝试编写国际程序,需要将一些文本发送到“其他文本编辑程序”,如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键发送到写大写字母

1 个答案:

答案 0 :(得分:1)

您可以使用GetGUIThreadInfo()在另一个进程中获取当前焦点窗口的HWND。但是,并非所有窗口类型都接受WM_SETTEXT。但是,您可以使用SendInput()将Unicode字符放入键盘队列中。或者像David所说的那样使用Automation API,但并非所有窗口类型都实现了这一点。