ControlSend / ControlSendRaw


向一个窗口或控件发送模拟键击。

ControlSend [, Control, Keys, WinTitle, WinText, ExcludeTitle, ExcludeText]
ControlSendRaw: 参数同上。

Parameters

Control

可以是控件的名称/文本或 ClassNN (控件的 classname(类名)和序号),它们都可以通过 Window Spy 来确定。当使用名称/文本时,matching behavior(匹配模式)通过 SetTitleMatchMode 决定。如果此参数为空或省略,目标窗口的顶端控件将被使用。如果这个参数为 ahk_parent,键击将会被直接发送到控件的父窗口 (见实例 Automating Winamp)。

要对一个控件的 HWND (窗口句柄)进行操作,将 Control 参数留空并为 WinTitle 参数指定 ahk_id %ControlHwnd% (这样即使当 DetectHiddenWindows 是 Off 状态,它也能对隐藏的控件起作用)。一个控件的 HWND 往往由 ControlGet Hwnd 、MouseGetPos 或 DllCall 取得。

Keys

一连串要发送的按键(详细请见 Send 命令)。如要发送一个原义的逗号,请进行 escape(转义) (例:`, )。键击被发送的速率由 SetKeyDelay 来决定。

Send 命令不同的是,鼠标点击不能通过 ControlSend 来发送,请用 ControlClick

WinTitle 目标窗口的标题或副标题(匹配模式由 SetTitleMatchMode 决定)。如果此参数和后面的3个参数被省略,Last Found Window(最近找到的窗口) 将被使用。如果此参数是字母 A 并且后面的三个参数被省略,激活的窗口将被使用。要使用一个窗口类,指定 ahk_class 确切的类名(通过 Window Spy 显示)。要使用一个 process identifier (PID)(进程标识符),指定 ahk_pid %包含PID的变量% 。要使用一个 window group(窗口组),指定 ahk_group GroupName 。要使用一个窗口的 unique ID number(唯一标识符编号),指定 ahk_id %包含ID的变量% 。通过指定 multiple criteria(多个条件) 缩小搜索范围。 例如:My File.txt ahk_class Notepad
WinText 如果用到,此参数必须是目标窗口的一个单独 text element(文本对象)的 substring(子字串) (像内置的 Window Spy 工具显示的一样)。如果 DetectHiddenText 是 ON 的状态,隐藏的文本对象将被探测。
ExcludeTitle 标题含有此参数值的窗口将不被考虑。
ExcludeText 文本含有此参数值的窗口将不被考虑。

ErrorLevel

如果遇到一个问题 ErrorLevel 设为 1 ,否则是 0 。

Remarks

ControlSendRaw 命令准确地按照键击本身在Keys 参数中显示的那样发送,而不是将 {Enter} 转换成一个 ENTER 键击,^c 转换成 Control-C 键击等等。

如果 Control 参数被省略,或目标窗口自身没有控件时,该命令将尝试通过发送到它的顶端控件(通常是正确的那一个)来直接发送到目标窗口。当一个窗口自身根本不带有控件或无所谓发送到哪个控件时,这么做是非常有用的。

默认情况下,修饰键(Control,Alt,Shift,和 Win 键) 将通常那样的通过 Send 命令被发送。这样可以让命令提示符和其他控制台窗口正确地检测到大写字母,键控字符等等。同时这样也提高了在其他方面上的可靠性。

然而,在某些情况下这些修饰键事件可能会干扰当前激活的窗口,尤其当一个 ControlSend 命令正在执行或 Alt 键正被发送(因为 Alt 键激活了当前激活窗口的菜单栏),而用户也正在活跃地打字的时候。通过明确地发送修饰键的按下和弹起事件可以避免这种情况的发生,如这个例子:
ControlSend, Edit1, {Alt down}f{Alt up}, 无标题 - 记事本

以上这种方式同时使得修饰键(Control/Alt/Shift/Win)的发送在工作站被锁定时(被登录提示框保护时)也生效。

当正在对一个控制台窗口如命令提示符使用 ControlSend 命令时,应避免使用 BlockInput 命令。这是因为,这么做会阻碍大小写按钮和修饰键(比如 Control 键)的正常工作。

SetKeyDelay 命令设置的数值决定按键被发送的速度。如果目标窗口无法正确可靠地接受键击,请尝试通过增加 SetKeyDelay 命令的第二个参数来增加按键时长,如这些例子:
SetKeyDelay, 10, 10
SetKeyDelay, 0, 10
SetKeyDelay, -1, 0

如果目标控件是一个 Edit(输入框) 控件(或某些类似的),以下命令以下的代码通常会比 ControlSend 更可靠并且更快:
Control, EditPaste, 这些文本将会被插入到光标处。, ControlName, WinTitle
ControlSetText, ControlName, 这些文本将会完全替换掉已存在的文本。, WinTitle

ControlSend 命令通常并不能很好地操控窗口的菜单栏。要解决这个问题,使用 WinMenuSelectItem 命令。如果由于菜单栏的类型导致这么做并不可行,您可以尝试通过学习 SendMessage Tutorial(发送消息指南) 来了解消息以操控需要的菜单项。

窗口的标题和窗口中的文字是大小写敏感的。要检测隐藏窗口,必须打开 DetectHiddenWindows

Related

SetKeyDelay, Escape sequences (e.g. `%) , Control, ControlGet, ControlGetText, ControlMove, ControlGetPos, ControlClick, ControlSetText, ControlFocus, Send, Automating Winamp

Examples

ControlSend, Edit1, 这是一行在记事本窗口中的文本。,  无标题
SetTitleMatchMode, 2
ControlSend, , abc, cmd.exe  ; 直接发送到命令提示符窗口。

翻译:游否 youfou@live.cn 2009年10月11日