如果您的目标应用程序不是前台窗口,您需要使用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;
要改为按标题(标题)查找窗口,您只需使用第二个参数即可FindWindow
。这会找到一个新的记事本实例,其中默认打开了“无标题”文件:
NpWnd := FindWindow(nil, 'Untitled - Notepad');
请注意,这需要与窗口标题完全匹配。例如,在 之前或之后的额外空格-
将导致匹配失败并且无法检索窗口句柄。
如果您有多个实例正在运行,则可以同时使用窗口类和标题。Readme.txt
要找到在加载的情况下运行的记事本副本,您可以使用
NpWnd := FindWindow('Notepad', 'Readme.txt - Notepad');
要查找其他应用程序,您需要使用 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;