Customizable __Tray__ Icons

Here you may post suggestions for improving and extending Dexpot.
mr

Customizable __Tray__ Icons

Postby mr » 22.04.2009 12:38:30

Some applications have only tray icons, and no taskbak icon.
How about to add this point to Desktop Windows setup. By default all icons in all desktops, and add the posibility to Move/Copy/Remove them.

Here's what i'm using now, suppose that will help you fast:
THIS: http://www.autohotkey.com/ script:

Code: Select all

#NoTrayIcon
DetectHiddenWindows, On

RegExMatch(TrayIcons("appName.exe"), "(?<=idn: )\d+", idn), HideTrayIcon(idn, bHide:=1) ; 1-hide, 0-show appName.exe
Return

TrayIcons(sExeName = "")
{
    WinGet,    pidTaskbar, PID, ahk_class Shell_TrayWnd
    hProc:=    DllCall("OpenProcess", "Uint", 0x38, "int", 0, "Uint", pidTaskbar)
    pProc:=    DllCall("VirtualAllocEx", "Uint", hProc, "Uint", 0, "Uint", 32, "Uint", 0x1000, "Uint", 0x4)
    idxTB:=    GetTrayBar()
        SendMessage, 0x418, 0, 0, ToolbarWindow32%idxTB%, ahk_class Shell_TrayWnd   ; TB_BUTTONCOUNT
    Loop,    %ErrorLevel%
    {
        SendMessage, 0x417, A_Index-1, pProc, ToolbarWindow32%idxTB%, ahk_class Shell_TrayWnd   ; TB_GETBUTTON
        VarSetCapacity(btn,32,0), VarSetCapacity(nfo,32,0)
        DllCall("ReadProcessMemory", "Uint", hProc, "Uint", pProc, "Uint", &btn, "Uint", 32, "Uint", 0)
            iBitmap    := NumGet(btn, 0)
            idn    := NumGet(btn, 4)
            Statyle := NumGet(btn, 8)
        If    dwData    := NumGet(btn,12)
            iString    := NumGet(btn,16)
        Else    dwData    := NumGet(btn,16,"int64"), iString:=NumGet(btn,24,"int64")
        DllCall("ReadProcessMemory", "Uint", hProc, "Uint", dwData, "Uint", &nfo, "Uint", 32, "Uint", 0)
        If    NumGet(btn,12)
            hWnd    := NumGet(nfo, 0)
        ,    uID    := NumGet(nfo, 4)
        ,    nMsg    := NumGet(nfo, 8)
        ,    hIcon    := NumGet(nfo,20)
        Else    hWnd    := NumGet(nfo, 0,"int64"), uID:=NumGet(nfo, 8), nMsg:=NumGet(nfo,12)
        WinGet, pid, PID,              ahk_id %hWnd%
        WinGet, sProcess, ProcessName, ahk_id %hWnd%
        WinGetClass, sClass,           ahk_id %hWnd%
        If !sExeName || (sExeName = sProcess) || (sExeName = pid)
            VarSetCapacity(sTooltip,128), VarSetCapacity(wTooltip,128*2)
        ,    DllCall("ReadProcessMemory", "Uint", hProc, "Uint", iString, "Uint", &wTooltip, "Uint", 128*2, "Uint", 0)
        ,    DllCall("WideCharToMultiByte", "Uint", 0, "Uint", 0, "str", wTooltip, "int", -1, "str", sTooltip, "int", 128, "Uint", 0, "Uint", 0)
        ,    sTrayIcons .= "idx: " . A_Index-1 . " | idn: " . idn . " | Pid: " . pid . " | uID: " . uID . " | MessageID: " . nMsg . " | hWnd: " . hWnd . " | Class: " . sClass . " | Process: " . sProcess . "`n" . "   | Tooltip: " . sTooltip . "`n"
    }
    DllCall("VirtualFreeEx", "Uint", hProc, "Uint", pProc, "Uint", 0, "Uint", 0x8000)
    DllCall("CloseHandle", "Uint", hProc)
    Return    sTrayIcons
}

RemoveTrayIcon(hWnd, uID, nMsg = 0, hIcon = 0, nRemove = 2)
{
    NumPut(VarSetCapacity(ni,444,0), ni)
    NumPut(hWnd , ni, 4)
    NumPut(uID  , ni, 8)
    NumPut(1|2|4, ni,12)
    NumPut(nMsg , ni,16)
    NumPut(hIcon, ni,20)
    Return    DllCall("shell32\Shell_NotifyIconA", "Uint", nRemove, "Uint", &ni)
}

HideTrayIcon(idn, bHide = True)
{
    idxTB := GetTrayBar()
    SendMessage, 0x404, idn, bHide, ToolbarWindow32%idxTB%, ahk_class Shell_TrayWnd   ; TB_HIDEBUTTON
    SendMessage, 0x1A, 0, 0, , ahk_class Shell_TrayWnd
}

DeleteTrayIcon(idx)
{
    idxTB := GetTrayBar()
    SendMessage, 0x416, idx - 1, 0, ToolbarWindow32%idxTB%, ahk_class Shell_TrayWnd   ; TB_DELETEBUTTON
    SendMessage, 0x1A, 0, 0, , ahk_class Shell_TrayWnd
}

MoveTrayIcon(idxOld, idxNew)
{
    idxTB := GetTrayBar()
    SendMessage, 0x452, idxOld - 1, idxNew - 1, ToolbarWindow32%idxTB%, ahk_class Shell_TrayWnd ; TB_MOVEBUTTON
}

GetTrayBar()
{
    ControlGet, hParent, hWnd,, TrayNotifyWnd1  , ahk_class Shell_TrayWnd
    ControlGet, hChild , hWnd,, ToolbarWindow321, ahk_id %hParent%
    Loop
    {
        ControlGet, hWnd, hWnd,, ToolbarWindow32%A_Index%, ahk_class Shell_TrayWnd
        If  Not    hWnd
            Break
        Else If    hWnd = %hChild%
        {
            idxTB := A_Index
            Break
        }
    }
    Return    idxTB
}

User avatar
Patrick
Developer
Posts: 7380
Joined: 04.03.2003 14:51:26

Re: Customizable __Tray__ Icons

Postby Patrick » 22.04.2009 14:03:11

:dex:
mr wrote:Here's what i'm using now, suppose that will help you fast:
THIS: http://www.autohotkey.com/ script:
[...]

Wow, I didn't know you could do that. :shock: Quite a bit of undocumented magic, but definitely something to consider for a future version. Thanks.


Return to “Feature requests”

Who is online

Users browsing this forum: No registered users and 25 guests