2009年5月11日 星期一

包山包海的 AutoHotKey (3) – TinySpy 輕鬆取得控件的名稱與文字

上一篇提到『用 AutoHotkey 自動化軟體操作』的一種方式是 控制其他程式的 視窗控件 (window control)。

常見的 視窗控件 (window control) 如下:

以下就來說明如何取得『控件』的名稱與文字。

.

取得控件資訊的工具

AutoHotKey 附帶的 AutoIt3 Window Spy 就是『取得控件資訊』的工具, 可以參考以下的介紹

.

另外, 也有用 AutoHotKey 腳本寫的 WinGet, another Window SPY (Smurth, 2008-11-12, AutoHotkey Community Forum)

.

TinySpy 輕鬆取得控件的名稱與文字

至於更簡單的版本, 可以參考我寫的 TinySpy.ahk, 其中最關鍵的是以下幾行

……
Gui, +LastFound
GUI_ID := WinExist()
SetTimer, GetSpyInfo, 250
……
return
……
GetSpyInfo:
……
MouseGetPos,x2 ,y2 , win_id, ctrl_id
if ( win_id = GUI_ID )
    Return 
WinGetTitle, win_title, ahk_id %win_id%
ControlGetText, ctrl_text, %ctrl_id%, ahk_id %win_id%
……

.

2009-05-10_065958


取得『記事本』的視窗資訊 和 文字
2009-05-10_070141 


無法用滑鼠選取文字的『對話框』,
一樣可以把文字取出來

101_藍藍路

.

完整腳本如下, 扣掉註解還不到 40 行

#SingleInstance,Force
#NoEnv
SetBatchLines, -1
SetTitleMatchMode, 2
applicationName = TinySpy
applicationVer = 1.0

Gui, Font, S11 CDefault
Gui, Add, CheckBox, w350 h20 vifSpyOn gClickSpyOnOff Checked
Gui, Add, Edit, w400 h300 vSpyInfo, no Data yet ...
Gui, Show, , %applicationName% %applicationVer%

; Need +LastFound to make WinExist() to return window id of GUI itself
Gui, +LastFound
GUI_ID := WinExist()

; set Spy update period
SetTimer, GetSpyInfo, 250

; config Spy ON/off (and also config AlwaysOnTop or not) according to "ifSpyOn" checkbox,
ClickSpyOnOff:
    Gui, Submit, NoHide
    if ifSpyOn
    {
        Gui, +AlwaysOnTop
        GuiControl, Text, ifSpyOn, Spy ON (Always on Top)
    }
    else
    {
        Gui, -AlwaysOnTop
        GuiControl, Text, ifSpyOn, Spy off
    }
    GuiControl, Focus, SpyInfo
    return

GuiClose:
    ExitApp

GetSpyInfo:
    Gui, Submit, NoHide
    if !ifSpyOn
        return
    MouseGetPos,x2 ,y2 , win_id, ctrl_id

; Not Spy on GUI itself
    if ( win_id = GUI_ID )
        Return

    WinGetTitle, win_title, ahk_id %win_id%
    ControlGetText, ctrl_text, %ctrl_id%, ahk_id %win_id%
    GuiControl,, SpyInfo, [Window]  %win_title%`n[Control]  %ctrl_id%`n========== [Text] ==========`n%ctrl_text%
    Return

.

1 意見:

發表您的回應
  1. 匿名 提到...

    整理的非常好,感謝

張貼留言