如何创建 .ahk(或类似的)热键来执行特定于程序的操作?

如何创建 .ahk(或类似的)热键来执行特定于程序的操作?

我是一名 AHK 用户,没有任何实际的计算机编程背景或教育背景(我想 Excel 是我所拥有的最接近这种知识/经验的东西,除了第一天的hello, world接触,或者cmd/VB6哇喔我使用 AHK 来处理许多日常任务和工作流程,但我使用脚本的方式一直是文字输入;换句话说,主要是模拟产生特定、表面的按键输入序列的按键输入。

从某种意义上说,这样做的好处是,我几乎不需要学习就可以使用 AHK——还有其他便利之处——但显然,优点与缺点并存。因此,我最近开始好奇 AHK 是否能够直接地接口和调用特定于程序的操作?

概念示例
让我们以 Notepad++ 为例(为了便于举例,我们假设它没有任何本机功能来实现这一点)。我想设置一个热键来复制、剪切粘贴二进制内容. 如果可能的话,我应该怎样创建脚本?

推测概念
作为我粗略收集信息的一部分,我确实尝试运行psr.exe看看我是否能够捕获任何有用的信息。不幸的是,我没有足够的知识来利用这些结果,但我认为可能存在某种类似于捕获后端发生的事情的方法,就像人们可能使用keyboard hook捕获非标准键输入一样。我已经托管了结果数据这里,以防万一可以利用。

编辑:为了澄清任何混淆,我不是指的是与脚本触发条件有关的条件特异性(例如#winactive)。我认为,如果不引起更多混淆并导致过于复杂,我很难再进一步描述,但如果我必须给出一个类似的例子,那么我想要实现的目标可以大致比作执行带有特定参数的程序,example.exe -function -parameter而不是自动运行过程,然后按预定的键通过 UIexample.exe导航到所述示例函数。Alt + F, F, P

编辑#2:好吧,显然我还是没有正确表达我的问题的意思。在放弃之前我会再试一次。

示例目标:

  • 创建调用此功能的热键:

示例命令

  • 我将会现在做吧:
    • 分配触发send输入序列的热键Alt + E, P, P, C, Enter
  • 去做吧:
    • 分配直接调用该Copy Binary Content功能的热键。
  • 挑战:确定哪个 AHK 函数实​​现了这一点(例如DllCall?),并枚举该函数的正确和可用的标识符/参数
  • 使用 PSR.exe 记录以下操作:

...步骤 1:用户左键单击“*ne”中的“编辑(菜单项)”程序:NOTEPAD++.EXE UI 元素:编辑、应用程序、*new 1 - Notepad++ [管理员]、Notepad++

步骤 2:用户左键单击“复制二进制内容(菜单项)”程序:NOTEPAD++.EXE UI 元素:复制二进制内容、选择性粘贴、#32768、*new 1 - Notepad++ [管理员]、Notepad++...

注意“#32768”!有没有办法直接调用该函数?

答案1

我理解这个问题的概述,并且它非常有意义,因为我已经尝试(并成功)使用不同的程序在不同程度上做到这一点。

有几种方法可以实现您想要的效果,下面按复杂程度的递增顺序列出(在我看来)...

窗口菜单选择项

首先,不太理想的方法是使用WinMenuSelectItem具有标准 Windows 菜单(例如功能区)的程序。

这种方法可以避免为了触发现有菜单选项而发送所有按键。WinMenuSelectItem然而,让这些命令工作有时很棘手,如果工作不正常(变成反复试验),调试起来可能不那么简单。有时我完全放弃了尝试,转而使用按键。

一旦给定的函数使用此方法,窗口就不一定要处于活动状态才能执行它,这很好。

发送消息

标准 Windows 程序的第二种方法是使用PostMessageSendMessage。使用 Windows 检查器(Spy++?还有其他流行的工具,但我记不清名字了。也许是 Sysinternals 工具之一?),您可以记录这些消息,并查看手动执行菜单功能时触发的内容,然后发送该消息。您基本上会记录所有 Windows 消息,然后仅过滤该窗口以查看发送的内容,然后尝试在代码中复制它。

这可能是一个不好的例子,但是使用 SendMessage 的随机代码片段:

SendMessage, % TCM_SETCURFOCUS:=0x1330,1 ,          , SysTabControl321, % helpWinTitle
SendMessage, % WM_SETTEXT:=0x0C       ,  , &HelpItem, Edit1,            % helpWinTitle   ; Edit1 = Search Tab search
SendMessage, % WM_KEYDOWN:=0x100      ,13,          , Edit1,            % helpWinTitle

COM 对象

对于 Microsoft Office 类型的程序,进入“幕后”的最佳方法是通过 COM 对象进行连接,然后公开 VBA 中已有的所有对象模型。这对于在 Word/Excel/等中执行您需要执行的任何操作都非常有用,因为您只需查找它的 VBA 代码,然后在 AutoHotkey 中实现等效代码即可完成特定任务。另一个优点是,它不需要启用宏权限即可连接到程序并执行某些操作,它 [Word/Excel/等] 只需运行即可。

无障碍设施

最后但并非最不重要的一点是,可利用辅助功能查找和执行不在标准菜单中但存在于程序或工具栏的 GUI 布局中的功能。这通常要高级和繁琐得多,但可以找到“幕后”的东西,否则您可能无法仅使用按键/鼠标点击来执行这些功能。

通常,您需要使用 Accessibility 树查看器深入研究特定的 GUI 设置以找到要执行的操作,然后将树引用传递给将调用该函数的代码、“按下”或“单击”按钮等。这在不使用标准 Windows 控件且NETUIHWND1在运行 Window Spy 时将鼠标悬停在控件上时仅获得引用的情况下最有用。Accessibility 允许您实际深入研究其构造,NETUIHWND1以便查找和/或执行其中的某些内容(文本、按钮等)

概括

可以做到吗?可以。显然,其中一些选项涉及大量编程,但如果您要搜索 AutoHotkey 帮助文件和论坛,我建议您从这些主题开始。

相关内容