0

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

4

1 回答 1

1

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

于 2014-01-17T22:55:41.080 回答