AutoHotkey Community

It is currently May 26th, 2012, 10:20 pm

All times are UTC [ DST ]




Post new topic Reply to topic  [ 5 posts ] 
Author Message
 Post subject: WinHide GUI
PostPosted: September 9th, 2009, 12:04 am 
Offline

Joined: January 10th, 2009, 6:40 pm
Posts: 32
WinHide GUI
Hide your windows when not using them, list the previously hidden windows with process names, window titles and icons and unhide them.

Hotkeys by default:
Left Win + Right click (on the taskbar button of the window or on the window itself) to hide a window
Left Win + Wheel up to show the list of the hidden windows
Left Win + Wheel down to hide it
Unhide the hidden windows by double clicking them in the list or using the context menu.
or Left Win + Middle click to unhide all of the previously hidden windows
Left Win + 0 to show the first windows from the list
Left Win + 1 to show the last window from the list

Update: v1.1
- With the help of Lexiko's function windows can now be hidden by (by default: Left Win + Right) clicking on their taskbar buttons.
- New hotkeys to unhide the last and first window in the list of the previously hidden windows

Download
Code:
#SingleInstance, Force
#NoEnv
;SetBatchLines, -1
;//Vars
hotkey_showgui = ~LWin & WheelUp ;Hotkey for showing the list of hidden windows
hotkey_hidegui = ~LWin & WheelDown ;Hotkey for hiding the list of hidden windows
hotkey_win_hide = ~LWin & RButton ;Hotkey for hiding a window
hotkey_win_unhideall = ~LWin & MButton ;Hotkey for unhiding all previously hidden windows
hotkey_win_unhide_last = ~LWin & 0 ;Hotkey for unhiding last hidden window in the list
hotkey_win_unhide_first = ~LWin & 1 ;Hotkey for unhiding the first hidden window in the list
timwait_autohide = 1000 ;Time to wait before hiding the gui when it loses focus - in ms
;//Autoexecute
Menu, Tray, NoStandard
Menu, Tray, add, &List Hidden Windows, ListHW
Menu, Tray, Default, &List Hidden Windows
Menu, Tray, Click, 1
Menu, Tray, add, Unhide &All Hidden Windows, UnHideHW
Menu, Tray, Add,
Menu, Tray, Add, &Reload, Reload
Menu, Tray, Add, E&xit, Exit
Menu, CMenu, Add, &Unhide selected, UnHideHWSpec
Menu, CMenu, Default, &Unhide selected
Menu, CMenu, Add, Unhide &all, UnHideHW
Menu, CMenu, Add,
Menu, CMenu, Add, E&xit, Exit

w_lv := A_ScreenWidth/3
gui, font, s13, Arial
Gui, +ToolWindow +AlwaysOnTop
Gui, Add, Listview, gListview  x0 -Hdr w%w_lv% r10, Name|Title|ID
Gui, Show, w%w_lv%, Hidden windows
WinGet, gui_id, id, A ;Get gui window id for autohiding
WinGet, gui_id_check, id, Hidden windows ahk_class AutoHotkeyGUI
Gui, Hide
If gui_id <> %gui_id_check% ;Make sure to get the right window id for the gui
  gui_id := gui_id_check
gui_id_check =
IconList := IL_Create(10,5)
IL_Add(IconList, "shell32.dll", 3) ;Icon of executables on XP
LV_SetImageList(IconList)

SetTimer, AutoHide, %timwait_autohide% ;Hide gui autmatically when user clicks somewhere outside the gui

;Hotkey init
Hotkey, %hotkey_showgui%, ListHW
Hotkey, %hotkey_hidegui%, HideListHW
Hotkey, %hotkey_win_hide%, Win_Hide
Hotkey, %hotkey_win_unhideall%, UnHideHW
Hotkey, %hotkey_win_unhide_last%, UnHideHW_Last
Hotkey, %hotkey_win_unhide_first%, UnHideHW_First

;//Subroutines, hotkeys
Listview:
If a_guievent = DoubleClick ;Hidden windows can be restored by clicking twice on the window's icon in the hidden windows' list
{
   LV_GetText(id_a, A_EventInfo, 3)
   WinShow, ahk_id %id_a%
   Lv_Delete(A_EventInfo)
    id_a =
}
total_hw := LV_GetCount()
Gui, Show, Hide Autosize, Hidden windows (%total_hw%)
return

GuiContextMenu:
  Menu, CMenu, Show, %a_guix%, %a_guiy%
return

Win_Hide:
If (InStr(hotkey_win_hide, "MButton") <> 0 OR InStr(hotkey_win_hide, "LButton") <> 0 OR InStr(hotkey_win_hide, "RButton") <> 0)
{
  If GetMouseTaskButton(hwnd) && hwnd
    id_a := hwnd
  Else
    MouseGetPos,,,id_a
}   
Else
  WinGet, id_a, id, A
WinGetTitle, title_a, ahk_id %id_a%
WinGet, pname_a, ProcessName, ahk_id %id_a%
;Filters
If id_a = %gui_id%
  return ;keep the script from hiding itself
If pname_a = crss.exe
  return
If title_a = Program Manager
  return
If (pname_a = "explorer.exe" && (title_a = "" OR title_a = "Start Menu"))
  return ;desktop, taskbar, etc.
;//////////////////////////
; (edited) code from Alt+Tab replacement
; http://www.autohotkey.com/forum/viewtopic.php?t=6422
;//////////////////////////
WS_DISABLED =0x8000000
WinGet, Style, Style, ahk_id %id_a%
If ((Style & WS_DISABLED) or ! (title_a)) ; skip unimportant windows ; ! title_a or
    return
;get icon of the window being hidden
SendMessage, 0x7F, 1, 0,, ahk_id %id_a%
h_icon := ErrorLevel
If ( ! h_icon )
{
  SendMessage, 0x7F, 2, 0,, ahk_id %id_a%
  h_icon := ErrorLevel
    If ( ! h_icon )
    {
      SendMessage, 0x7F, 0, 0,, ahk_id %id_a%
      h_icon := ErrorLevel
        If ( ! h_icon )
        {
          h_icon := DllCall( "GetClassLong", "uint", id_a, "int", -34 ) ; GCL_HICONSM is -34
          If ( ! h_icon )
            h_icon := DllCall( "LoadIcon", "uint", 0, "uint", 32512 ) ; IDI_APPLICATION is 32512
        }
    }
}
If ! ( h_icon = "" or h_icon = "FAIL") ; Add the HICON directly to the icon list
{
     Gui_Icon_Number := DllCall("ImageList_ReplaceIcon", UInt, IconList, Int, -1, UInt, h_icon)
   Gui_Icon_Number ++
   LV_Add("Icon" . Gui_Icon_Number, pname_a, title_a, id_a)
}
Else
{
  LV_Add("Icon1", pname_a, title_a, id_a) ;if no icon found, set icon to the icon of executables
}   
;//////////////////////////
; end of code from Alt+Tab replacement
;//////////////////////////
LV_ModifyCol()
LV_ModifyCol(3, 0) ;not a very elegant solution... oh well
WinHide, ahk_id %id_a%
id_a =
total_hw := LV_GetCount()
Gui, Show, Hide Autosize, Hidden windows (%total_hw%)
return

ListHW:
Gui, Show
return

HideListHW:
GuiClose:
Gui, Hide
return

l_c := LV_GetCount()
UnHideHW: ;Unhide all hidden windows
Loop, %l_c%
{
   Lv_GetText(id_a, a_index, 3)
   WinShow, ahk_id %id_a%
}
LV_Delete()
total_hw := LV_GetCount()
Gui, Show, Hide Autosize, Hidden windows (%total_hw%)
return

UnHideHWSpec: ;Unhide selected windows
l_c := LV_GetCount("Selected")
Loop, %l_c% ;Unhide selected, delete em from the list
{
  r_s = 0
  r_s := LV_GetNext(r_s)
  LV_GetText(id_a, r_s, 3)
  WinShow, ahk_id %id_a%
  Lv_Delete(r_s)
}
total_hw := LV_GetCount()
Gui, Show, Autosize, Hidden windows (%total_hw%)
id_a =
return

UnHideHW_Last:
LV_GetText(id_a,1,3)
WinShow, ahk_id %id_a%
LV_Delete(1)
total_hw := LV_GetCount()
Gui, Show, Autosize, Hidden window (%total_hw%)
id_a =
return

UnHideHW_First:
last_hw := LV_GetCount()
LV_GetText(id_a, last_hw, 3)
WinShow, ahk_id %id_a%
LV_Delete(last_hw)
total_hw := LV_GetCount()
Gui, Show, Autosize, Hidden window (%total_hw%)
id_a =
last_hw =
return

Autohide: ;Hide GUI automatically when losing focus
IfWinNotActive, ahk_id %gui_id%
  If a_guievent <> guicontextmenu
    Gui, Hide
return

Reload:
l_c := LV_GetCount()
Loop, %l_c%
{
   Lv_GetText(id_a, a_index, 3)
   WinShow, ahk_id %id_a%
}   
Reload
return

Exit:
l_c := LV_GetCount()
Loop, %l_c% ;Unhide all hidden windows before exiting or reloading
{
   Lv_GetText(id_a, a_index, 3)
   WinShow, ahk_id %id_a%
}   
ExitApp
return

;//////////////////////////
; function by Lexikos
; http://www.autohotkey.com/forum/viewtopic.php?p=168788#168788
;//////////////////////////
; Gets the index+1 of the taskbar button which the mouse is hovering over.
; Returns an empty string if the mouse is not over the taskbar's task toolbar.
; Some code and inspiration from Sean's TaskButton.ahk http://www.autohotkey.com/forum/topic18652.html
GetMouseTaskButton(ByRef hwnd)
{
    CoordMode, Mouse, Screen
    MouseGetPos, x, y, win, ctl, 2
    ; Check if hovering over taskbar.
    WinGetClass, cl, ahk_id %win%
    if (cl != "Shell_TrayWnd")
        return
    ; Check if hovering over a Toolbar.
    WinGetClass, cl, ahk_id %ctl%
    if (cl != "ToolbarWindow32")
        return
    ; Check if hovering over task-switching buttons (specific toolbar).
    hParent := DllCall("GetParent", "Uint", ctl)
    WinGetClass, cl, ahk_id %hParent%
    if (cl != "MSTaskSwWClass")
        return

   
    WinGet, pidTaskbar, PID, ahk_class Shell_TrayWnd

    hProc := DllCall("OpenProcess", "Uint", 0x38, "int", 0, "Uint", pidTaskbar)
    pRB := DllCall("VirtualAllocEx", "Uint", hProc
        , "Uint", 0, "Uint", 20, "Uint", 0x1000, "Uint", 0x4)

    VarSetCapacity(pt, 8, 0)
    NumPut(x, pt, 0, "int")
    NumPut(y, pt, 4, "int")
   
    ; Convert screen coords to toolbar-client-area coords.
    DllCall("ScreenToClient", "uint", ctl, "uint", &pt)
   
    ; Write POINT into explorer.exe.
    DllCall("WriteProcessMemory", "uint", hProc, "uint", pRB+0, "uint", &pt, "uint", 8, "uint", 0)

;     SendMessage, 0x447,,,, ahk_id %ctl%  ; TB_GETHOTITEM
    SendMessage, 0x445, 0, pRB,, ahk_id %ctl%  ; TB_HITTEST
    btn_index := ErrorLevel
    ; Convert btn_index to a signed int, since result may be -1 if no 'hot' item.
    if btn_index > 0x7FFFFFFF
        btn_index := -(~btn_index) - 1
   
   
    if (btn_index > -1)
    {
        ; Get button info.
        SendMessage, 0x417, btn_index, pRB,, ahk_id %ctl%   ; TB_GETBUTTON
   
        VarSetCapacity(btn, 20)
        DllCall("ReadProcessMemory", "Uint", hProc
            , "Uint", pRB, "Uint", &btn, "Uint", 20, "Uint", 0)
   
        state := NumGet(btn, 8, "UChar")  ; fsState
        pdata := NumGet(btn, 12, "UInt")  ; dwData
       
        ret := DllCall("ReadProcessMemory", "Uint", hProc
            , "Uint", pdata, "UintP", hwnd, "Uint", 4, "Uint", 0)
    } else
        hwnd = 0

       
    DllCall("VirtualFreeEx", "Uint", hProc, "Uint", pRB, "Uint", 0, "Uint", 0x8000)
    DllCall("CloseHandle", "Uint", hProc)


    ; Negative values indicate seperator items. (abs(btn_index) is the index)
    return btn_index > -1 ? btn_index+1 : 0
}
;//////////////////////////
; end of function
; http://www.autohotkey.com/forum/viewtopic.php?p=168788#168788
;//////////////////////////


Last edited by gahks on September 12th, 2009, 3:49 pm, edited 2 times in total.

Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: September 12th, 2009, 12:14 am 
Offline

Joined: December 21st, 2008, 7:29 pm
Posts: 181
This is awesome, thank you!


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: September 12th, 2009, 3:45 pm 
Offline

Joined: January 10th, 2009, 6:40 pm
Posts: 32
My pleasure:)

Cheers
gahks


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: October 25th, 2009, 10:14 am 
Offline

Joined: June 1st, 2006, 5:04 pm
Posts: 45
Location: Denmark
Hey cool! This is amazingly useful for me.

Thanks mate! :)

_________________
Casper


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: November 4th, 2009, 8:39 pm 
Offline

Joined: October 16th, 2009, 6:59 am
Posts: 6
:D

Nice work!


Report this post
Top
 Profile  
Reply with quote  
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 5 posts ] 

All times are UTC [ DST ]


Who is online

Users browsing this forum: Cristi®, spg SCOTT and 12 guests


You can post new topics in this forum
You can reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Powered by phpBB® Forum Software © phpBB Group