如何使用delphi 2010将虚拟按键发送到其他应用程序?

Sid*_*ang -1 delphi virtual-keyboard delphi-2010

我需要将几个虚拟键(VK_RETURN)从我的delphi应用程序(myapp.exe)发送到另一个应用程序(target.exe)。 Eg : Send VK_RETURN twice , from myapp.exe , into target.exe

我使用的操作系统是Windows 7 64位和Windows XP。

我读到:如何将“ENTER”按键发送到另一个应用程序?将 Ctrl+Key 发送到第三方应用程序(对我来说不起作用)以及其他先前提出的问题。但我还是很困惑。

如何将焦点设置到目标应用程序?

如何将虚拟按键发送到目标应用程序?

简单的例子:我想将 VK_RETURN 发送两次到 notepad.exe 或 calc.exe (已加载)或我的 delphi 应用程序中的任何其他程序。怎么做 ?

请在 Delphi 2010 中执行此操作的最简单方法...

PS:我尝试了来自http://delphi.about.com/od/adptips2004/a/bltip1104_3.htm的SndKey32.pass 并得到错误:[DCC错误] SndKey32.pas(420): E2010不兼容的类型:'Char'和'安西查尔'

  If (Length(KeyString)=1) then MKey:=vkKeyScan(KeyString[1])
Run Code Online (Sandbox Code Playgroud)

Ken*_*ite 5

如果您的目标应用程序不是前台窗口,则需要使用PostMessage将击键发送到其窗口句柄。您可以使用 获取该窗口句柄FindWindow。下面的代码将Enter密钥发送到正在运行的记事本实例中的文本区域(请注意,它FindWindowEx首先使用附加项来定位备注区域)。它在 Windows 7 64 上使用 Delphi 2007 和 Delphi XE4(32 位目标)进行了测试。

uses Windows;
    
procedure TForm1.Button1Click(Sender: TObject);
var
  NpWnd, NpEdit: HWnd;
begin
  NpWnd := FindWindow('Notepad', nil);
  if NpWnd <> 0 then
  begin
    NpEdit := FindWindowEx(NpWnd, 0, 'Edit', nil);
    if NpEdit <> 0 then
    begin
      PostMessage(NpEdit, WM_KEYDOWN, VK_RETURN, 0);
      PostMessage(NpEdit, WM_KEYUP, VK_RETURN, 0); 
    end;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

要按标题 (caption) 查找窗口,您只需使用第二个参数即可FindWindow。这会找到一个记事本的新实例,并打开默认的“无标题”文件:

NpWnd := FindWindow(nil, 'Untitled - Notepad');
Run Code Online (Sandbox Code Playgroud)

请注意,这需要窗口标题完全匹配。-例如,之前或之后的额外空格将导致匹配失败并且无法检索窗口句柄。

如果您有多个实例正在运行,则可以同时使用窗口类和标题。要查找已加载的记事本副本Readme.txt,您可以使用

NpWnd := FindWindow('Notepad', 'Readme.txt - Notepad');
Run Code Online (Sandbox Code Playgroud)

要查找其他应用程序,您需要使用 WinSpy 或 WinSight 等工具来查找窗口类名称。(还有其他的,例如 Winspector 或 WinDowse(两者都是用 Delphi 编写的)。)

您的评论提到Calculator;根据 Winspector 的说法,Calculator主窗口位于 Windows 7 上调用的窗口类中CalcFrame,显示数字的区域是一个Static窗口(这意味着它似乎不直接接收击键)。这些按钮被简单地称为Button,因此您必须通过EnumChildWindows查找各个按钮来识别它们来循环遍历它们,以获得它们的句柄。

(如何枚举子窗口是一个单独的问题;您可能可以通过搜索此处或通过 Google 找到示例。如果您找不到,请发布一个关于该问题的新的单独问题,我们可以尝试为您提供答案。)

下面是通过窗口类找到计算器后将密钥发送到计算器的快速示例。它没有做任何有用的事情,因为它需要花费一些时间来识别不同的按钮和每个响应的键(以及消息的正确组合)。该代码只是发送11Numpad+22到计算器窗口(快速测试表明它们已正确接收和显示,这就是我想在该过程上花费的所有时间)。

uses Windows;

procedure TForm1.Button1Click(Sender: TObject);
var
  NpWnd: HWnd;
begin
  NpWnd := FindWindow('CalcFrame',  nil);
  if NpWnd <> 0 then
  begin
    PostMessage(NpWnd, WM_KEYDOWN, VK_NUMPAD1, 0);
    PostMessage(NpWnd, WM_KEYDOWN, VK_ADD, 0);
    PostMessage(NpWnd, WM_KEYDOWN, VK_NUMPAD2, 0);
  end;
end;
Run Code Online (Sandbox Code Playgroud)