如何使用Delphi2010将虚拟密钥发送到其他应用程序?

如何使用Delphi2010将虚拟密钥发送到其他应用程序?,delphi,delphi-2010,virtual-keyboard,Delphi,Delphi 2010,Virtual Keyboard,我需要从我的delphi应用程序myapp.exe向另一个应用程序target.exe发送几个虚拟密钥VK_RETURN。 例如:将VK_RETURN从myapp.exe发送两次到target.exe 我使用的操作系统是Windows7 64位和WindowsXP 我读到:,没有为我工作和其他以前问过的问题。 但我还是感到困惑 如何将焦点设置到目标应用程序 如何将虚拟密钥发送到目标应用程序 简单示例:我想将VK_RETURN两次发送到notepad.exe或calc.exe中,或者从我的delp

我需要从我的delphi应用程序myapp.exe向另一个应用程序target.exe发送几个虚拟密钥VK_RETURN。 例如:将VK_RETURN从myapp.exe发送两次到target.exe

我使用的操作系统是Windows7 64位和WindowsXP

我读到:,没有为我工作和其他以前问过的问题。 但我还是感到困惑

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

如何将虚拟密钥发送到目标应用程序

简单示例:我想将VK_RETURN两次发送到notepad.exe或calc.exe中,或者从我的delphi应用程序发送到任何其他程序中。怎么做

在Delphi 2010中实现此功能的最简单方法,请

附言: 我试过SndKey32。从 并得到错误:[DCC错误]SndKey32.pas420:E2010不兼容的类型:“Char”和“AnsiChar”


如果目标应用程序不是前台窗口,则需要使用向其窗口句柄发送击键。你可以用它来弄那个窗户把手。下面的代码将Enter键发送到Notepad note的运行实例中的文本区域,它首先使用一个附加按钮来定位备注区域。它在Windows764上使用Delphi2007和DelphiXE4 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;
请注意,这需要与窗口标题完全匹配。例如,在-之前或之后的额外空间将导致匹配失败,并且无法检索窗口句柄

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

NpWnd := FindWindow('Notepad', 'Readme.txt - Notepad');
要查找其他应用程序,需要使用WinSpy或WinSight之类的工具来查找窗口类名。还有其他一些,如Winspector或WinDowse,它们都是用Delphi编写的

你的评论提到了计算器;根据Winspector的说法,计算器主窗口位于Windows7上一个名为CalcFrame的窗口类中,显示数字的区域是一个静态窗口,这意味着它似乎不会直接接收击键。这些按钮被简单地称为Button,因此您必须使用查找单个按钮来识别它们,以获得它们的句柄来循环它们

如何枚举子窗口是一个单独的问题;你可以在这里或通过谷歌搜索找到一个例子。如果你不能,发布一个新的,单独的问题,我们可以尝试给你一个答案

下面是一个通过window类查找计算器后向其发送键的快速示例。它没有做任何有用的事情,因为它需要花费一些时间来识别不同的按钮和每个按钮响应的键以及消息的正确组合。这段代码只是将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;

你说的专注是什么意思。窗口或其上的特定控件?可能重复@Tony:focus意味着直接将虚拟键发送到目标。exe@Ken怀特:在我提出这个问题之前,我已经阅读了所有的链接。但是如何只将虚拟键发送到target.exe?如果我的问题很难理解,我只想将VK_RETURN发送两次到notepad.exe,该notepad.exe已从我的delphi应用程序加载。怎么做?是的,它在记事本中工作。但是其他应用程序呢?我有一个名为DKQC.EXE和DKQG.EXE的应用程序,我想在DKQG.EXE中发送两次Enter VK_Return的按键和确认消息,以替换鼠标单击。或者您可以使用acdess12.EXE测试脚本,在那里打开一个文件夹,我们按Return/Enter。要在中打开文件,请按另一个enter键两次enter。如何使其在ACDSee12.exe中工作?因为你的脚本只能在记事本上运行。我的脚本它不是脚本,它的代码可以在记事本上运行,因为这是它特别寻找的东西。如果您需要它为另一个应用程序工作,您需要找出您需要查找的窗口类-我没有安装软件,我不需要在我的计算机上为您找出它。:-搜索WinSpy或WinSight,这可以帮助您找到与我在记事本中找到的信息相同的信息。我将您链接到文档,并向您提供了有关WinSpy和WinSight的信息。还有WInspector和WinDowse。如果要使用WinAPI做一些事情,有时需要阅读文档并解决问题。我将更新我的代码,同时向Calc发送几个数字键并按名称查找,但之后您需要使用我提供的工具,并花一些时间自己尝试解决这个问题:-@ShaunRoselt:它们是在Windows.pas中定义的。
NpWnd := FindWindow('Notepad', 'Readme.txt - Notepad');
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;