AHK 控制发送

AHK ControlSend

我并没有真正处理过 AHK,但我看到了一个脚本,该脚本设法将击键发送到 window 并且 Window 解释击键并相应地显示它们。该脚本使用了一个名为 ControlSend 的函数。我很好奇这个函数在 Win32 API 中到底做了什么。我可以假设它使用的最接近的函数是 SendMessage/PostMessag;但是,当我使用 WM_KEYDOWN 作为消息实际测试 PostMessage/SendMessage 到 window 时,window 无法解释它。所以这不是真正的编码问题,而是 AHK 中的 ControlSend 实际上依赖于 Win32 API 中的更多功能?它不是用 keybd_event 或 SendInput 模拟键盘,因为即使进程 window 处于后台且未聚焦,它也设法发送击键。我试过搜索这个但没有解释。

这是 AHK 脚本

Loop{

sendKey("a")
}


F1::
if (mypid == 0){
    WinGet, var, PID, A
    mypid = %var%
    MsgBox, Found client %mypid%
}



sendKey(key)
{
global mypid
WinClose
ControlSend,,{%key%}, ahk_pid %mypid%
}

AutoHotkey是开源的,可以直接在Lexikos' GitHub.

上查看底层C++代码

Here 是您要查看的相关函数。
如果您控制发送,aTargetWindow HWND 将是非空的。
各种检查和魔术都在那里完成,但最后,您通常会到达 this 函数,其中关键是 sent 通过发布WM_KEYDOWNWM_KEYUP 消息到目标 window.
在某些特殊情况下(如果密钥似乎没有 VK 或 SC),它是通过发布 WM_CHAR 消息来发送的。

这是我通过快速查看源代码可以知道的,但如前所述,其中有很多内容。我建议您自己看一下,阅读那些非常有用的评论,其中有很多