# ControlGetFocus

检索目标窗口的哪个控件有输入焦点，若有的话。

ControlGetFocus, OutputVar [, WinTitle, WinText, ExcludeTitle, ExcludeText]

#### 参数

OutputVar | 存储控件标识符的变量名称，控件标识符在它的父窗口里由它的类名跟序号组成，例如 Button12 。
WinTitle | 目标窗口的标题或副标题 (通过 SetTitleMatchMode 定义匹配行为)。如果此参数和后面的3个参数被省略，最近找到的窗口 将被使用。如果此参数是字母 A 并且后面的3个参数被省略，活动的窗口将被使用。要使用一个窗口类，指定 ahk_class 确切的类名 (通过Window Spy显示)。要使用一个 process 标识符 (PID)，指定 ahk_pid %包含PID的变量% 。要使用一个 窗口组 ，指定 ahk_group 组名。要使用一个窗口的 unique ID 编号 ，指定 ahk_id %包含ID的变量% 。通过指定 多个条件 缩小搜索范围。例如： My File.txt ahk_class Notepad
WinText | 如果出现，此参数必须是目标窗口的一个单独文本对象的子字串(像内置的Window Spy工具显示的一样)。如果 DetectHiddenText 是 ON 的状态，隐藏的文本对象将被探测。
ExcludeTitle | 标题包括此参数值的窗口将不被考虑。
ExcludeText | 文本包括此参数值的窗口将不被考虑。

#### ErrorLevel

如果带输入焦点的控件被成功地检索到，ErrorLevel 将设为 0 。否则设为 1 (例如目标窗口不存在或者它没有控件带输入焦点) 。

#### 注意

被此命令检索到的控件是带键盘焦点的，也就是说，如果用户去键入任意内容，那控件将收到键击。

目标窗口必须被激活才获得一个焦点控件。如果窗口未激活，OutputVar 将为空。

如果 ControlGetFocus 以一个高频率(例如每 500 ms 一次或更快)重复地执行，它将可能扰乱用户的双击能力。一个应对方案是通过 DllCall 调用操作系统的 GetGUIThreadInfo() 。例如：

    ; 此脚本检索激活窗口焦点控件的 ahk_id (HWND) 。
    ; 此脚本需要 Windows 98 或者 NT 4.0 SP3+，或近期其他系统。
    GuiThreadInfoSize = 48
    VarSetCapacity(GuiThreadInfo, GuiThreadInfoSize)
    NumPut(GuiThreadInfoSize, GuiThreadInfo, 0)
    if not DllCall("GetGUIThreadInfo", uint, 0, str, GuiThreadInfo)
    {
        MsgBox GetGUIThreadInfo() indicated a failure.
        return
    }
    FocusedHWND := NumGet(GuiThreadInfo, 12)  ; 从结构体检索 hwnd焦点区域。
    MsgBox % "The focused control's ahk_id (HWND) is " . FocusedHWND
    ; 此 ID 能被所有控件命令使用。例如：
    ; ControlGetText, OutputVar,, ahk_id %FocusedHWND%

窗口标题和文本是区分大小写的。隐藏的窗口将不被探测，除非已打开 DetectHiddenWindows 。

#### 相关命令

ControlFocus, ControlMove, ControlClick, ControlGetText, ControlSetText, ControlSend

#### 示例

    ControlGetFocus, OutputVar, 无标题 - 记事本
    if ErrorLevel
        MsgBox, 目标窗口不存在或者它没有控件带输入焦点。
    else
        MsgBox, 带焦点的控件 = %OutputVar%

翻译：天堂之门 menk33@163.com 2008年7月26日