Added hul, a script for restoring hidden windows

This commit is contained in:
joten 2020-12-04 16:04:14 +01:00 committed by GitHub
parent 513adaa5f6
commit 0e912908e5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 187 additions and 0 deletions

187
tools/hul.ahk Normal file
View File

@ -0,0 +1,187 @@
/**
* hul! - Find and restore (hidden) windows
* Copyright (c) 2011 joten
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* @version 0.1.0.01 (02.10.2011)
*/
NAME := "hul!"
VERSION := "0.1.0"
HELP :=
(Join
"USAGE`n
`n
Specify one, two or all of the following search criteria:`n
- Type a regular expression in the field next to 'Partial title'.`n
- Type a class name (exact match) in the field next to 'Class name'.`n
- Type a process name (e. g. the name of an exeutable, exact match) in the field next to 'Process name'.`n
`n
The search will be done on typing the search criteria.`n
`n
You may navigate between the input fields by pressing Tab (forward) or Shift+Tab (back).`n
Press Enter to go to the list box, which contains the search results.`n
Select an entry and press Enter again to restore the selected window.`n
`n
Press the Escape (Esc) key to clear all fields and go back to entering the search criteria.`n"
)
/**
* Script settings
*/
#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
#NoTrayIcon
#SingleInstance force
SendMode Input ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory.
; DetectHiddenWindows, On
; SetFormat, Integer, h
/**
* Pseudo main function
*/
WinGet, Main_aWndId, ID, A
; BEGIN: Init GUI
IfWinExist, %NAME%
Gui, Destroy
Gui, +LastFound +0xCF0000 -0x80000000
Gui, Add, Text, yp+11, Partial Title:
Gui, Add, Edit, xp+82 yp-3 w700 gButtonSearch vGui_title,
Gui, Add, Text, xm, Class Name:
Gui, Add, Edit, xp+82 yp-3 w700 gButtonSearch vGui_class,
Gui, Add, Text, xm, Process Name:
Gui, Add, Edit, xp+82 yp-3 w700 gButtonSearch vGui_pName,
; Gui, Add, Button, xm w800 vGui_search, Search
Gui, Add, ListBox, +0x100 t36 xm w800 vGui_wnds,
Gui, Add, Button, Default Hidden w800 vGui_restore, Restore
Gui, Show, AutoSize, %NAME%
Gui_wndId := WinExist()
Main_resize()
; END: Init GUI
Return ; end of the auto-execute section
/**
* Hotkeys, function & label definitions
*/
#IfWinActive hul! ahk_class AutoHotkeyGUI
{
^h::MsgBox %HELP%
}
ButtonRestore:
Main_restore()
Return
ButtonSearch:
Main_search()
Return
GuiClose:
ExitApp
Return
GuiEscape:
GuiControl, , Gui_title,
GuiControl, , Gui_class,
GuiControl, , Gui_pName,
GuiControl, , Gui_wnds, |
GuiControl, Focus, Gui_title
Return
GuiSize:
Main_resize(A_GuiWidth, A_GuiHeight)
Return
Main_resize(w = 0, h = 0) {
Global Gui_wndId
If (w = 0 Or h = 0) {
Sleep, 250
WinGetPos, x, y, w, h, ahk_id %Gui_wndId%
h += 1
WinMove, ahk_id %Gui_wndId%, , x, y, w, h
} Else {
w -= 2 * 10
w1 := w - (72 + 10)
h -= 3 * 30
; y := 8 + (3 * 30) + h + 8
GuiControl, Move, Gui_title, w%w1%
GuiControl, Move, Gui_class, w%w1%
GuiControl, Move, Gui_pName, w%w1%
; GuiControl, Move, Gui_search, w%w%
GuiControl, Move, Gui_wnds, w%w% h%h%
; GuiControl, Move, Gui_restore, y%y% w%w%
}
}
Main_restore() {
Global Gui_wnds
GuiControlGet, wnd, , Gui_wnds
If wnd {
wndId := SubStr(wnd, 1, InStr(wnd, ": ") - 1)
WinShow, ahk_id %wndId%
WinRestore, ahk_id %wndId%
WinSet, AlwaysOnTop, On, ahk_id %wndId%
WinSet, AlwaysOnTop, Off, ahk_id %wndId%
WinMove, ahk_id %wndId%, , 0, 0, 800, 600
} Else
GuiControl, Focus, Gui_wnds
}
Main_search() {
Global Gui_class, Gui_pName, Gui_title, Gui_wndId, Gui_wnds
GuiControl, , Gui_wnds, |
GuiControlGet, title, , Gui_title
GuiControlGet, class, , Gui_class
If class
criteria .= " ahk_class " class
GuiControlGet, pName, , Gui_pName
If pName {
Process, Exist, %pName%
If ErrorLevel
criteria .= " ahk_pid " ErrorLevel
}
If Not (criteria Or title)
criteria := "A"
wndListString := ""
DetectHiddenWindows, On
WinGet, wndId, List, % criteria
Loop, % wndId {
WinGetTitle, wndTitle, % "ahk_id " wndId%A_Index%
If Not (wndId%A_Index% = Gui_wndId) And (Not title Or RegExmatch(wndTitle, title)) {
WinGetClass, wndClass, % "ahk_id " wndId%A_Index%
WinGet, wndPName, ProcessName, % "ahk_id " wndId%A_Index%
WinGet, wndStyle, Style, % "ahk_id " wndId%A_Index%
WinGetPos, wndPosX, wndPosY, wndPosW, wndPosH, % "ahk_id " wndId%A_Index%
wndListString .= "|" wndId%A_Index% ": `t" wndTitle " (" wndClass ", " wndPName ", " wndStyle ", " wndPosX ", " wndPosY ", " wndPosW ", " wndPosH ")"
}
}
DetectHiddenWindows, Off
GuiControl, , Gui_wnds, % wndListString
}