Is there a way to put an icon outside the hidden tray icons by default?

Get help with using AutoHotkey (v1.1 and older) and its commands and hotkeys
malcev
Posts: 1769
Joined: 12 Aug 2014, 12:37

Re: Is there a way to put an icon outside the hidden tray icons by default?

06 Nov 2020, 16:10

Then You have to test it by Yourself.
1) does script find Your program icon
2) does it get the right location of icon
and so on...
teadrinker
Posts: 4399
Joined: 29 Mar 2015, 09:41
Contact:

Re: Is there a way to put an icon outside the hidden tray icons by default?

06 Nov 2020, 17:42

Code: Select all

#NoEnv
SetBatchLines, -1
t := true
Return

$F1:: HideShowMyIcon(t := !t)

HideShowMyIcon(showHide) { ; showHide = false ? hide : show
   prevDHW := A_DetectHiddenWindow
   prevCMM := A_CoordModeMouse
   DetectHiddenWindows, On
   CoordMode, Mouse
   
   GetToolbars(hToolbarNotifyIconOverflowWindow, hToolbarTrayNotifyWnd)
   hActive := WinExist("A")
   hCoverWindow := HideScene()
   ShowNotifyIconOverflowWindow(hCoverWindow)
   Loop 1 {
      if !GetMyTrayIconInfo(showHide ? hToolbarNotifyIconOverflowWindow : hToolbarTrayNotifyWnd, POINT := 1, hIcon)
         break ; icon not found
      hCursor := CreateCursor()
      ReplaceSystemCursors(hCursor)
      Menu, Tray, Icon, HICON:%hCursor%
      MouseGetPos, mouseX, mouseY
      Loop {
         if (A_Index > 1)
            ShowNotifyIconOverflowWindow(hCoverWindow)
         DragIcon(&POINT, showHide ? hToolbarTrayNotifyWnd : hToolbarNotifyIconOverflowWindow, 2)
      } until GetMyTrayIconInfo(showHide ? hToolbarTrayNotifyWnd : hToolbarNotifyIconOverflowWindow) || A_Index = 3
      MouseMove, mouseX, mouseY, 0
   }
   ReplaceSystemCursors()
   if hIcon
      Menu, Tray, Icon, HICON:%hIcon%
   WinHide, ahk_class NotifyIconOverflowWindow
   WinSet, Transparent, Off, ahk_class NotifyIconOverflowWindow
   WinActivate, ahk_id %hActive%
   WinClose, ahk_id %hCoverWindow%
   CoordMode, Mouse, % prevCMM
   DetectHiddenWindows, % prevDHW
}

GetToolbars(ByRef hToolbarNotifyIconOverflowWindow, ByRef hToolbarTrayNotifyWnd) {
   ControlGet, hToolbarNotifyIconOverflowWindow, hwnd,, ToolbarWindow321, ahk_class NotifyIconOverflowWindow
   for k, v in ["TrayNotifyWnd", "SysPager", "ToolbarWindow32"]
      hToolBar := DllCall("FindWindowEx", "Ptr", k = 1 ? WinExist("ahk_class Shell_TrayWnd") : hToolBar, "Ptr", 0, "Str", v, "UInt", 0, "Ptr")
   hToolbarTrayNotifyWnd := hToolBar
}

ShowNotifyIconOverflowWindow(hCoverWindow) {
   WinSet, Transparent, 1, ahk_class NotifyIconOverflowWindow
   WinShow, ahk_class NotifyIconOverflowWindow
   Sleep, 100
}

GetMyTrayIconInfo(hToolbar, ByRef POINT := "", ByRef hIcon := "") {
   static TB_GETBUTTON   := 0x417
        , TB_BUTTONCOUNT := 0x418
        , TB_GETITEMRECT := 0x41D
        , PtrSize := 4 << A_Is64bitOS
        , szTBBUTTON := 8 + PtrSize*3
        , szTRAYDATA := 16 + PtrSize*2
        
   WinGet, PID, PID, ahk_exe explorer.exe
   RemoteBuff := new RemoteBuffer(PID, szTRAYDATA)
   VarSetCapacity(TBBUTTON, szTBBUTTON)
   VarSetCapacity(TRAYDATA, szTRAYDATA)
   VarSetCapacity(RECT, 16)
   
   WinExist("ahk_id " . hToolBar)
   WinGetPos, toolbarX, toolbarY
   SendMessage, TB_BUTTONCOUNT
   Loop % ErrorLevel {
      SendMessage, TB_GETBUTTON, A_Index - 1, RemoteBuff.ptr
      RemoteBuff.Read(TBBUTTON, szTBBUTTON)
      RemoteBuff.Read(TRAYDATA, szTRAYDATA, NumGet(&TBBUTTON + 8 + PtrSize) - RemoteBuff.ptr)
      hWnd := NumGet(TRAYDATA)
      if (hWnd = A_ScriptHwnd && (found := true) && POINT) {
         VarSetCapacity(POINT, 8, 0)
         hIcon := NumGet(TRAYDATA, 16 + PtrSize)
         SendMessage, TB_GETITEMRECT, A_Index - 1, RemoteBuff.ptr
         RemoteBuff.Read(RECT, 16)
         for k, v in ["Left", "Top", "Right", "Bottom"]
            button%v% := NumGet(RECT, 4*(k - 1), "UInt")
         centerX := toolbarX + buttonLeft + (buttonRight - buttonLeft)//2
         centerY := toolbarY + buttonTop  + (buttonBottom - buttonTop)//2
         NumPut(centerX, POINT), NumPut(centerY, POINT, 4, "UInt")
         break
      }
   }
   Return !!found
}

DragIcon(pPOINT, hDestToolBar, speed) {
   WinGetPos, toolbarX, toolbarY, toolbarW, toolbarH, ahk_id %hDestToolBar%
   xIcon := NumGet(pPOINT + 0, "UInt"), yIcon := NumGet(pPOINT + 4, "UInt")
   MouseMove, xIcon, yIcon, 0
   MouseClickDrag, L, xIcon, yIcon, toolbarX + toolbarW//2, toolbarY + toolbarH//2, speed
}
 
HideScene() {
   Gui, New, -Caption +AlwaysOnTop +ToolWindow +LastFound +hwndhGui
   WinSet, Transparent, 255
   Gui, +E0x20
   Gui, Margin, 0, 0
   Gui, Add, Pic,, % "HBITMAP:" . GetHBitmapFromScreen()
   Gui, Show, NA x0 y0
   Return hGui
}

GetHBitmapFromScreen() {
   Sysget, x, 76
   Sysget, y, 77
   Sysget, w, 78
   Sysget, h, 79

   hDC := DllCall("GetDC", "Ptr", 0, "Ptr")
   hBM := DllCall("CreateCompatibleBitmap", "Ptr", hDC, "Int", W, "Int", H, "Ptr")
   hMDC := DllCall("CreateCompatibleDC", "Ptr", hDC, "Ptr")
   hObj := DllCall("SelectObject", "Ptr", hMDC, "Ptr", hBM)
   DllCall("BitBlt", "Ptr", hMDC, "Int", 0, "Int", 0, "Int", W, "Int", H
                   , "Ptr", hDC, "Int", X, "Int", Y, "UInt", SRCCOPY := 0x00CC0020)
   DllCall("SelectObject", "Ptr", hMDC, "Ptr", hObj)
   DllCall("DeleteDC", "Ptr", hMDC)
   DllCall("ReleaseDC", "Ptr", 0, "Ptr", hDC)
   Return hBM
}

CreateCursor() {
   base64 := GetCursor()
   Return CreateIconFromBase64(base64, 16)
}

ReplaceSystemCursors(IDC = "")
{
   static IMAGE_CURSOR := 2, SPI_SETCURSORS := 0x57
        , exitFunc := Func("ReplaceSystemCursors").Bind("")
        , SysCursors := { IDC_APPSTARTING: 32650
                        , IDC_ARROW      : 32512
                        , IDC_CROSS      : 32515
                        , IDC_HAND       : 32649
                        , IDC_HELP       : 32651
                        , IDC_IBEAM      : 32513
                        , IDC_NO         : 32648
                        , IDC_SIZEALL    : 32646
                        , IDC_SIZENESW   : 32643
                        , IDC_SIZENWSE   : 32642
                        , IDC_SIZEWE     : 32644
                        , IDC_SIZENS     : 32645 
                        , IDC_UPARROW    : 32516
                        , IDC_WAIT       : 32514 }
   if !IDC {
      DllCall("SystemParametersInfo", "UInt", SPI_SETCURSORS, "UInt", 0, "UInt", 0, "UInt", 0)
      OnExit(exitFunc, 0)
   }
   else  {
      if !(IDC + 0)
         hCursor := DllCall("LoadCursor", "Ptr", 0, "UInt", SysCursors[IDC], "Ptr")
      for k, v in SysCursors  {
         (IDC + 0 && hCursor := IDC)
         hCopy := DllCall("CopyImage", "Ptr", hCursor, "UInt", IMAGE_CURSOR, "Int", 0, "Int", 0, "UInt", 0, "Ptr")
         DllCall("SetSystemCursor", "Ptr", hCopy, "UInt", v)
      }
      OnExit(exitFunc)
   }
}

CreateIconFromBase64(StringBASE64, Size)
{
   StringBase64ToData(StringBASE64, IconData)
   Return DllCall("CreateIconFromResourceEx", Ptr, &IconData + 4
      , "UInt", NumGet(&IconData, "UInt"), "UInt", true, "UInt", 0x30000, "Int", Size, "Int", Size, "UInt", 0)
}
   
StringBase64ToData(StringBase64, ByRef OutData)
{
   DllCall("Crypt32.dll\CryptStringToBinary", Ptr, &StringBase64 
      , "UInt", StrLen(StringBase64), "UInt", CRYPT_STRING_BASE64 := 1, "UInt", 0, "UIntP", Bytes, "UIntP", 0, "UIntP", 0)

   VarSetCapacity(OutData, Bytes)
   DllCall("Crypt32.dll\CryptStringToBinary", Ptr, &StringBase64 
      , "UInt", StrLen(StringBase64), "UInt", CRYPT_STRING_BASE64, "Str", OutData, "UIntP", Bytes, "UIntP", 0, "UIntP", 0)
   Return Bytes
}

class RemoteBuffer
{
   __New(PID, size) {
      static flags := (PROCESS_VM_OPERATION := 0x8) | (PROCESS_VM_WRITE := 0x20) | (PROCESS_VM_READ := 0x10)
           , Params := ["UInt", MEM_COMMIT := 0x1000, "UInt", PAGE_READWRITE := 0x4, "Ptr"]
         
      if !this.hProc := DllCall("OpenProcess", "UInt", flags, "Int", 0, "UInt", PID, "Ptr")
         throw Exception("Can't open remote process PID = " . PID . "`nA_LastError: " . A_LastError, "RemoteBuffer.__New")
      
      if !this.ptr := DllCall("VirtualAllocEx", "Ptr", this.hProc, "Ptr", 0, "Ptr", size, Params*) {
         DllCall("CloseHandle", "Ptr", this.hProc)
         throw Exception("Can't allocate memory in remote process PID = " . PID . "`nA_LastError: " . A_LastError, "RemoteBuffer.__New")
      }
   }
   
   __Delete() {
      DllCall("VirtualFreeEx", "Ptr", this.hProc, "Ptr", this.ptr, "UInt", 0, "UInt", MEM_RELEASE := 0x8000)
      DllCall("CloseHandle", "Ptr", this.hProc)
   }
   
   Read(ByRef localBuff, size, offset = 0) {
      VarSetCapacity(localBuff, size, 0)
      if !DllCall("ReadProcessMemory", "Ptr", this.hProc, "Ptr", this.ptr + offset, "Ptr", &localBuff, "Ptr", size, "PtrP", bytesRead)
         throw Exception("Can't read data from remote buffer`nA_LastError: " . A_LastError, "RemoteBuffer.Read")
      Return bytesRead
   }
   
   Write(pData, size, offset = 0) {
      if !res := DllCall("WriteProcessMemory", "Ptr", this.hProc, "Ptr", this.ptr + offset, "Ptr", pData, "Ptr", size, "PtrP", bytesWritten)
         throw Exception("Can't write data to remote buffer`nA_LastError: " . A_LastError, "RemoteBuffer.Write")
      Return bytesWritten
   }
}

GetCursor() {
   Cur16 = 
   (LTrim Join
      aAQAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      AAAAAAAAAAAAAAAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
      //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAA==
   )
   Return Cur16
}
malcev
Posts: 1769
Joined: 12 Aug 2014, 12:37

Re: Is there a way to put an icon outside the hidden tray icons by default?

06 Nov 2020, 17:50

Your code dont work with 2 running ahk processes.
teadrinker
Posts: 4399
Joined: 29 Mar 2015, 09:41
Contact:

Re: Is there a way to put an icon outside the hidden tray icons by default?

06 Nov 2020, 17:51

What do you mean? I have a lot of running ahk processes.
malcev
Posts: 1769
Joined: 12 Aug 2014, 12:37

Re: Is there a way to put an icon outside the hidden tray icons by default?

06 Nov 2020, 17:57

Tested more times.
For me it works unreliable.
teadrinker
Posts: 4399
Joined: 29 Mar 2015, 09:41
Contact:

Re: Is there a way to put an icon outside the hidden tray icons by default?

06 Nov 2020, 18:00

For me works well on two computers. You can try decreasing mouse speed in the script.
malcev
Posts: 1769
Joined: 12 Aug 2014, 12:37

Re: Is there a way to put an icon outside the hidden tray icons by default?

06 Nov 2020, 18:01

1) Compile Your script
2) Run it - It appears in notification area.
3) Press f1 - appears white flash - nothing happens.
malcev
Posts: 1769
Joined: 12 Aug 2014, 12:37

Re: Is there a way to put an icon outside the hidden tray icons by default?

06 Nov 2020, 18:06

It cannot find icon

Code: Select all

if !GetMyTrayIconInfo(showHide ? hToolbarNotifyIconOverflowWindow : hToolbarTrayNotifyWnd, POINT := 1, hIcon)
{
msgbox not found
}
User avatar
JoeWinograd
Posts: 2213
Joined: 10 Feb 2014, 20:00
Location: U.S. Central Time Zone

Re: Is there a way to put an icon outside the hidden tray icons by default?

06 Nov 2020, 18:18

Hi malcev,

I've found three issues so far: (1) accOverflowNotificationArea.accName is the tooltip, not the program name. I could not find the doc for its enumerations...do you know what the right field is? (2) Anyway, I changed the code to do an InStr on the tooltip, so it finds the icon, and reports the X/Y coordinates, but it doesn't always move it...what's really weird is that sometimes it does, other times it doesn't. Sometimes if I run it several times in a row, it will eventually move it, but not always. (3) Sometimes it actually executes the program instead of moving the icon!

Regards, Joe
malcev
Posts: 1769
Joined: 12 Aug 2014, 12:37

Re: Is there a way to put an icon outside the hidden tray icons by default?

06 Nov 2020, 18:30

Tooltip You can get manually.
Try decrease speed:

Code: Select all

program := "file.exe"
mouseSpeed := 100

DetectHiddenWindows on
CoordMode, Mouse, Screen
SetBatchLines -1
SetWinDelay -1
ControlGet, hwndOverflowNotificationArea, hwnd,, ToolbarWindow321, ahk_class NotifyIconOverflowWindow
ControlGet, hwndSystemPromotedNotificationArea, hwnd,, ToolbarWindow322, ahk_class Shell_TrayWnd
ControlGet, hwndUserPromotedNotificationArea, hwnd,, ToolbarWindow323, ahk_class Shell_TrayWnd
ControlGet, hwndButton, hwnd,, Button2, ahk_class Shell_TrayWnd
accOverflowNotificationArea := Acc_ObjectFromWindow(hwndOverflowNotificationArea)
accSystemPromotedNotificationArea := Acc_ObjectFromWindow(hwndSystemPromotedNotificationArea)
accUserPromotedNotificationArea := Acc_ObjectFromWindow(hwndUserPromotedNotificationArea)
accButton := Acc_ObjectFromWindow(hwndButton)
return

f11::
loop % accOverflowNotificationArea.accChildCount
{
   if (accOverflowNotificationArea.accName(A_Index) = program)
   {
      MouseGetPos, xpos, ypos
      location := Acc_Location(accOverflowNotificationArea, A_Index)
      WinGetPos, WinX, WinY,,, ahk_id %hwndOverflowNotificationArea%
      WinGetPos, taskbarWinX, taskbarWinY, taskbarWinW, taskbarWinH, ahk_class Shell_TrayWnd
      x := location.x + location.w//2 - WinX
      y := location.y + location.h//2 - WinY
      PostMessage, WM_LBUTTONDOWN := 0x201, 1, ((y<<16)^x),, ahk_id %hwndOverflowNotificationArea%
      if (taskbarWinY != 0)   ; taskbar down
         MouseMove, location.x+location.w//1.4, taskbarWinY+location.h, mouseSpeed
      else if (taskbarWinH < A_ScreenHeight)   ; taskbar up
         MouseMove, location.x+location.w//1.4, taskbarWinH-location.h, mouseSpeed
      else if (taskbarWinX != 0)   ; taskbar right
         MouseMove, taskbarWinX+location.w, location.y+location.h//1.4, mouseSpeed
      else   ; taskbar left
         MouseMove, taskbarWinW-location.w, location.y+location.h//1.4, mouseSpeed
      PostMessage, WM_LBUTTONUP := 0x202 , 0, ((y<<16)^x),, ahk_id %hwndOverflowNotificationArea%
      MouseMove, xpos, ypos, mouseSpeed
      break
   }
}
return

f12::
loop 2
{
   if (A_Index = 1)
      accToolbar := accUserPromotedNotificationArea
   else
      accToolbar := accSystemPromotedNotificationArea
   loop % accToolbar.accChildCount
   {
      if (accToolbar.accName(A_Index) = program)
      {
         CurrentWindow := WinExist("A")
         MouseGetPos, xpos, ypos
         location := Acc_Location(accToolbar, A_Index)
         WinGetPos, taskbarWinX, taskbarWinY, taskbarWinW, taskbarWinH, ahk_class Shell_TrayWnd
         WinActivate, ahk_class Shell_TrayWnd
         x := location.x + location.w//2
         y := location.y + location.h//2
         if (taskbarWinY != 0)   ; taskbar down
            MouseClickDrag, left, x, y, x, taskbarWinY-location.h, mouseSpeed
         else if (taskbarWinH < A_ScreenHeight)   ; taskbar up
            MouseClickDrag, left, x, y, x, taskbarWinH+location.h, mouseSpeed
         else if (taskbarWinX != 0)   ; taskbar right
            MouseClickDrag, left, x, y, taskbarWinX-location.w, y, mouseSpeed
         else   ; taskbar left
            MouseClickDrag, left, x, y, taskbarWinW+location.w, y, mouseSpeed
         if (accOverflowNotificationArea.accChildCount != 1)
            accButton.accDoDefaultAction(0)
         WinActivate, ahk_id %CurrentWindow%
         MouseMove, xpos, ypos, mouseSpeed
         break 2
     }
   }
}
return





; http://www.autohotkey.com/board/topic/77303-acc-library-ahk-l-updated-09272012/
; https://dl.dropbox.com/u/47573473/Web%20Server/AHK_L/Acc.ahk
;------------------------------------------------------------------------------
; Acc.ahk Standard Library
; by Sean
; Updated by jethrow:
; 	Modified ComObjEnwrap params from (9,pacc) --> (9,pacc,1)
; 	Changed ComObjUnwrap to ComObjValue in order to avoid AddRef (thanks fincs)
; 	Added Acc_GetRoleText & Acc_GetStateText
; 	Added additional functions - commented below
; 	Removed original Acc_Children function
; last updated 2/25/2010
;------------------------------------------------------------------------------

Acc_Init()
{
	Static	h
	If Not	h
		h:=DllCall("LoadLibrary","Str","oleacc","Ptr")
}
Acc_ObjectFromEvent(ByRef _idChild_, hWnd, idObject, idChild)
{
	Acc_Init()
	If	DllCall("oleacc\AccessibleObjectFromEvent", "Ptr", hWnd, "UInt", idObject, "UInt", idChild, "Ptr*", pacc, "Ptr", VarSetCapacity(varChild,8+2*A_PtrSize,0)*0+&varChild)=0
	Return	ComObjEnwrap(9,pacc,1), _idChild_:=NumGet(varChild,8,"UInt")
}

Acc_ObjectFromPoint(ByRef _idChild_ = "", x = "", y = "")
{
	Acc_Init()
	If	DllCall("oleacc\AccessibleObjectFromPoint", "Int64", x==""||y==""?0*DllCall("GetCursorPos","Int64*",pt)+pt:x&0xFFFFFFFF|y<<32, "Ptr*", pacc, "Ptr", VarSetCapacity(varChild,8+2*A_PtrSize,0)*0+&varChild)=0
	Return	ComObjEnwrap(9,pacc,1), _idChild_:=NumGet(varChild,8,"UInt")
}

Acc_ObjectFromWindow(hWnd, idObject = -4)
{
	Acc_Init()
	If	DllCall("oleacc\AccessibleObjectFromWindow", "Ptr", hWnd, "UInt", idObject&=0xFFFFFFFF, "Ptr", -VarSetCapacity(IID,16)+NumPut(idObject==0xFFFFFFF0?0x46000000000000C0:0x719B3800AA000C81,NumPut(idObject==0xFFFFFFF0?0x0000000000020400:0x11CF3C3D618736E0,IID,"Int64"),"Int64"), "Ptr*", pacc)=0
	Return	ComObjEnwrap(9,pacc,1)
}

Acc_WindowFromObject(pacc)
{
	If	DllCall("oleacc\WindowFromAccessibleObject", "Ptr", IsObject(pacc)?ComObjValue(pacc):pacc, "Ptr*", hWnd)=0
	Return	hWnd
}

Acc_GetRoleText(nRole)
{
	nSize := DllCall("oleacc\GetRoleText", "Uint", nRole, "Ptr", 0, "Uint", 0)
	VarSetCapacity(sRole, (A_IsUnicode?2:1)*nSize)
	DllCall("oleacc\GetRoleText", "Uint", nRole, "str", sRole, "Uint", nSize+1)
	Return	sRole
}

Acc_GetStateText(nState)
{
	nSize := DllCall("oleacc\GetStateText", "Uint", nState, "Ptr", 0, "Uint", 0)
	VarSetCapacity(sState, (A_IsUnicode?2:1)*nSize)
	DllCall("oleacc\GetStateText", "Uint", nState, "str", sState, "Uint", nSize+1)
	Return	sState
}

Acc_SetWinEventHook(eventMin, eventMax, pCallback)
{
	Return	DllCall("SetWinEventHook", "Uint", eventMin, "Uint", eventMax, "Uint", 0, "Ptr", pCallback, "Uint", 0, "Uint", 0, "Uint", 0)
}

Acc_UnhookWinEvent(hHook)
{
	Return	DllCall("UnhookWinEvent", "Ptr", hHook)
}
/*	Win Events:
	pCallback := RegisterCallback("WinEventProc")
	WinEventProc(hHook, event, hWnd, idObject, idChild, eventThread, eventTime)
	{
		Critical
		Acc := Acc_ObjectFromEvent(_idChild_, hWnd, idObject, idChild)
		; Code Here:
	}
*/

; Written by jethrow
Acc_Role(Acc, ChildId=0) {
	try return ComObjType(Acc,"Name")="IAccessible"?Acc_GetRoleText(Acc.accRole(ChildId)):"invalid object"
}
Acc_State(Acc, ChildId=0) {
	try return ComObjType(Acc,"Name")="IAccessible"?Acc_GetStateText(Acc.accState(ChildId)):"invalid object"
}
Acc_Location(Acc, ChildId=0, byref Position="") { ; adapted from Sean's code
	try Acc.accLocation(ComObj(0x4003,&x:=0), ComObj(0x4003,&y:=0), ComObj(0x4003,&w:=0), ComObj(0x4003,&h:=0), ChildId)
	catch
		return
	Position := "x" NumGet(x,0,"int") " y" NumGet(y,0,"int") " w" NumGet(w,0,"int") " h" NumGet(h,0,"int")
	return	{x:NumGet(x,0,"int"), y:NumGet(y,0,"int"), w:NumGet(w,0,"int"), h:NumGet(h,0,"int")}
}
Acc_Parent(Acc) { 
	try parent:=Acc.accParent
	return parent?Acc_Query(parent):
}
Acc_Child(Acc, ChildId=0) {
	try child:=Acc.accChild(ChildId)
	return child?Acc_Query(child):
}
Acc_Query(Acc) { ; thanks Lexikos - www.autohotkey.com/forum/viewtopic.php?t=81731&p=509530#509530
	try return ComObj(9, ComObjQuery(Acc,"{618736e0-3c3d-11cf-810c-00aa00389b71}"), 1)
}
Acc_Error(p="") {
	static setting:=0
	return p=""?setting:setting:=p
}
Acc_Children(Acc) {
	if ComObjType(Acc,"Name") != "IAccessible"
		ErrorLevel := "Invalid IAccessible Object"
	else {
		Acc_Init(), cChildren:=Acc.accChildCount, Children:=[]
		if DllCall("oleacc\AccessibleChildren", "Ptr",ComObjValue(Acc), "Int",0, "Int",cChildren, "Ptr",VarSetCapacity(varChildren,cChildren*(8+2*A_PtrSize),0)*0+&varChildren, "Int*",cChildren)=0 {
			Loop %cChildren%
				i:=(A_Index-1)*(A_PtrSize*2+8)+8, child:=NumGet(varChildren,i), Children.Insert(NumGet(varChildren,i-8)=9?Acc_Query(child):child), NumGet(varChildren,i-8)=9?ObjRelease(child):
			return Children.MaxIndex()?Children:
		} else
			ErrorLevel := "AccessibleChildren DllCall Failed"
	}
	if Acc_Error()
		throw Exception(ErrorLevel,-1)
}
Acc_ChildrenByRole(Acc, Role) {
	if ComObjType(Acc,"Name")!="IAccessible"
		ErrorLevel := "Invalid IAccessible Object"
	else {
		Acc_Init(), cChildren:=Acc.accChildCount, Children:=[]
		if DllCall("oleacc\AccessibleChildren", "Ptr",ComObjValue(Acc), "Int",0, "Int",cChildren, "Ptr",VarSetCapacity(varChildren,cChildren*(8+2*A_PtrSize),0)*0+&varChildren, "Int*",cChildren)=0 {
			Loop %cChildren% {
				i:=(A_Index-1)*(A_PtrSize*2+8)+8, child:=NumGet(varChildren,i)
				if NumGet(varChildren,i-8)=9
					AccChild:=Acc_Query(child), ObjRelease(child), Acc_Role(AccChild)=Role?Children.Insert(AccChild):
				else
					Acc_Role(Acc, child)=Role?Children.Insert(child):
			}
			return Children.MaxIndex()?Children:, ErrorLevel:=0
		} else
			ErrorLevel := "AccessibleChildren DllCall Failed"
	}
	if Acc_Error()
		throw Exception(ErrorLevel,-1)
}
Acc_Get(Cmd, ChildPath="", ChildID=0, WinTitle="", WinText="", ExcludeTitle="", ExcludeText="") {
	static properties := {Action:"DefaultAction", DoAction:"DoDefaultAction", Keyboard:"KeyboardShortcut"}
	AccObj :=   IsObject(WinTitle)? WinTitle
			:   Acc_ObjectFromWindow( WinExist(WinTitle, WinText, ExcludeTitle, ExcludeText), 0 )
	if ComObjType(AccObj, "Name") != "IAccessible"
		ErrorLevel := "Could not access an IAccessible Object"
	else {
		StringReplace, ChildPath, ChildPath, _, %A_Space%, All
		AccError:=Acc_Error(), Acc_Error(true)
		Loop Parse, ChildPath, ., %A_Space%
			try {
				if A_LoopField is digit
					Children:=Acc_Children(AccObj), m2:=A_LoopField ; mimic "m2" output in else-statement
				else
					RegExMatch(A_LoopField, "(\D*)(\d*)", m), Children:=Acc_ChildrenByRole(AccObj, m1), m2:=(m2?m2:1)
				if Not Children.HasKey(m2)
					throw
				AccObj := Children[m2]
			} catch {
				ErrorLevel:="Cannot access ChildPath Item #" A_Index " -> " A_LoopField, Acc_Error(AccError)
				if Acc_Error()
					throw Exception("Cannot access ChildPath Item", -1, "Item #" A_Index " -> " A_LoopField)
				return
			}
		Acc_Error(AccError)
		StringReplace, Cmd, Cmd, %A_Space%, , All
		properties.HasKey(Cmd)? Cmd:=properties[Cmd]:
		try {
			if (Cmd = "Location")
				AccObj.accLocation(ComObj(0x4003,&x:=0), ComObj(0x4003,&y:=0), ComObj(0x4003,&w:=0), ComObj(0x4003,&h:=0), ChildId)
			  , ret_val := "x" NumGet(x,0,"int") " y" NumGet(y,0,"int") " w" NumGet(w,0,"int") " h" NumGet(h,0,"int")
			else if (Cmd = "Object")
				ret_val := AccObj
			else if Cmd in Role,State
				ret_val := Acc_%Cmd%(AccObj, ChildID+0)
			else if Cmd in ChildCount,Selection,Focus
				ret_val := AccObj["acc" Cmd]
			else
				ret_val := AccObj["acc" Cmd](ChildID+0)
		} catch {
			ErrorLevel := """" Cmd """ Cmd Not Implemented"
			if Acc_Error()
				throw Exception("Cmd Not Implemented", -1, Cmd)
			return
		}
		return ret_val, ErrorLevel:=0
	}
	if Acc_Error()
		throw Exception(ErrorLevel,-1)
}
User avatar
JoeWinograd
Posts: 2213
Joined: 10 Feb 2014, 20:00
Location: U.S. Central Time Zone

Re: Is there a way to put an icon outside the hidden tray icons by default?

07 Nov 2020, 16:41

malcev wrote:Tooltip You can get manually
Hi malcev,
I may not have been clear enough in my comment. What I tried to say is that accOverflowNotificationArea.accName is NOT the program name...thus, this equality check always fails:

Code: Select all

if (accOverflowNotificationArea.accName(A_Index) = program)
By testing, I determined that accOverflowNotificationArea.accName is actually the tooltip. I'm fine with that, and changed the code to this (which works well for my purposes):

Code: Select all

tooltip:=accOverflowNotificationArea.accName(A_Index)
if (InStr(tooltip,program))
Although that works fine for me, I'm curious what the program name is for that object, but I couldn't find its enumerations at the Microsoft docs site.
malcev wrote:Try decrease speed
As it turns out, the faster speed is better. I experimented with different values...100 and other large numbers failed, and so did MouseSpeed:=1, but MouseSpeed:=2 works well...hasn't failed yet.

Thanks for your help. Regards, Joe
malcev
Posts: 1769
Joined: 12 Aug 2014, 12:37

Re: Is there a way to put an icon outside the hidden tray icons by default?

07 Nov 2020, 17:02

It is not tooltip, it is name property.
https://docs.microsoft.com/en-us/windows/win32/winauto/name-property
Name property of tray icon is equal its tooltip.
User avatar
JoeWinograd
Posts: 2213
Joined: 10 Feb 2014, 20:00
Location: U.S. Central Time Zone

Re: Is there a way to put an icon outside the hidden tray icons by default?

07 Nov 2020, 17:31

malcev wrote:It is not tooltip, it is name property.
Yes, I get that they call it the "Name" property...all I'm saying is that it is not the "Name" in the sense of being the file name, such as program := "file.exe" in your posted code. That works if, and only if, you don't change the tooltip...which I do change in all my programs. Regards, Joe
User avatar
JoeWinograd
Posts: 2213
Joined: 10 Feb 2014, 20:00
Location: U.S. Central Time Zone

Re: Is there a way to put an icon outside the hidden tray icons by default?

07 Nov 2020, 17:54

teadrinker wrote:for me it works
Hi teadrinker,
Works for me, too, and I'd like to give it a try, but for icons in the overflow tray other than the running script. I could not figure out what I would have to change in your script in order to move an icon in the overflow tray by specifying its WinTitle...I'd be happy to use just about any WinTitle criterion, including ahk_class, ahk_id, ahk_pid, or ahk_exe. Thanks much, Joe
teadrinker
Posts: 4399
Joined: 29 Mar 2015, 09:41
Contact:

Re: Is there a way to put an icon outside the hidden tray icons by default?

09 Nov 2020, 17:54

Hi @JoeWinograd
I'm not sure if it makes sence to use my script for applications other than the running script. Since the script moves a tray icon via dragging, it makes its icon invisible, and moving is unnoticed. But the script can't hide a tray icon of another application, so moving will be visible in this case.
For Skype.exe:

Code: Select all

#NoEnv
SetBatchLines, -1
t := true
Process, Exist, Skype.exe
PID := ErrorLevel
Return

$F1:: HideShowIcon(t := !t, PID)

HideShowIcon(showHide, PID := "") { ; showHide = false ? hide : show
   prevDHW := A_DetectHiddenWindow
   prevCMM := A_CoordModeMouse
   DetectHiddenWindows, On
   CoordMode, Mouse
   
   GetToolbars(hToolbarNotifyIconOverflowWindow, hToolbarTrayNotifyWnd)
   hActive := WinExist("A")
   hCoverWindow := HideScene()
   ShowNotifyIconOverflowWindow(hCoverWindow)
   Loop 1 {
      if !GetTrayIconInfo(showHide ? hToolbarNotifyIconOverflowWindow : hToolbarTrayNotifyWnd, POINT := 1, hIcon, PID)
         break ; icon not found
      hCursor := CreateCursor()
      ReplaceSystemCursors(hCursor)
      if !PID
         Menu, Tray, Icon, HICON:%hCursor%
      MouseGetPos, mouseX, mouseY
      Loop {
         if (A_Index > 1)
            ShowNotifyIconOverflowWindow(hCoverWindow)
         DragIcon(&POINT, showHide ? hToolbarTrayNotifyWnd : hToolbarNotifyIconOverflowWindow, 2)
      } until GetTrayIconInfo(showHide ? hToolbarTrayNotifyWnd : hToolbarNotifyIconOverflowWindow,,, PID) || A_Index = 3
      MouseMove, mouseX, mouseY, 0
   }
   ReplaceSystemCursors()
   if (hIcon && !PID)
      Menu, Tray, Icon, HICON:%hIcon%
   WinHide, ahk_class NotifyIconOverflowWindow
   WinSet, Transparent, Off, ahk_class NotifyIconOverflowWindow
   WinActivate, ahk_id %hActive%
   WinClose, ahk_id %hCoverWindow%
   CoordMode, Mouse, % prevCMM
   DetectHiddenWindows, % prevDHW
}

GetToolbars(ByRef hToolbarNotifyIconOverflowWindow, ByRef hToolbarTrayNotifyWnd) {
   ControlGet, hToolbarNotifyIconOverflowWindow, hwnd,, ToolbarWindow321, ahk_class NotifyIconOverflowWindow
   for k, v in ["TrayNotifyWnd", "SysPager", "ToolbarWindow32"]
      hToolBar := DllCall("FindWindowEx", "Ptr", k = 1 ? WinExist("ahk_class Shell_TrayWnd") : hToolBar, "Ptr", 0, "Str", v, "UInt", 0, "Ptr")
   hToolbarTrayNotifyWnd := hToolBar
}

ShowNotifyIconOverflowWindow(hCoverWindow) {
   WinSet, Transparent, 1, ahk_class NotifyIconOverflowWindow
   WinShow, ahk_class NotifyIconOverflowWindow
   Sleep, 100
}

GetTrayIconInfo(hToolbar, ByRef POINT := "", ByRef hIcon := "", ProcID := "") {
   static TB_GETBUTTON   := 0x417
        , TB_BUTTONCOUNT := 0x418
        , TB_GETITEMRECT := 0x41D
        , PtrSize := 4 << A_Is64bitOS
        , szTBBUTTON := 8 + PtrSize*3
        , szTRAYDATA := 16 + PtrSize*2
        
   WinGet, PID, PID, ahk_exe explorer.exe
   RemoteBuff := new RemoteBuffer(PID, szTRAYDATA)
   VarSetCapacity(TBBUTTON, szTBBUTTON)
   VarSetCapacity(TRAYDATA, szTRAYDATA)
   VarSetCapacity(RECT, 16)
   
   WinExist("ahk_id " . hToolBar)
   WinGetPos, toolbarX, toolbarY
   SendMessage, TB_BUTTONCOUNT
   Loop % ErrorLevel {
      SendMessage, TB_GETBUTTON, A_Index - 1, RemoteBuff.ptr
      RemoteBuff.Read(TBBUTTON, szTBBUTTON)
      RemoteBuff.Read(TRAYDATA, szTRAYDATA, NumGet(&TBBUTTON + 8 + PtrSize) - RemoteBuff.ptr)
      hWnd := NumGet(TRAYDATA)
      if ProcID
         WinGet, WinProcID, PID, ahk_id %hWnd%
      b := ProcID ? WinProcID = ProcID : hWnd = A_ScriptHwnd
      if (b && (found := true) && POINT) {
         VarSetCapacity(POINT, 8, 0)
         hIcon := NumGet(TRAYDATA, 16 + PtrSize)
         SendMessage, TB_GETITEMRECT, A_Index - 1, RemoteBuff.ptr
         RemoteBuff.Read(RECT, 16)
         for k, v in ["Left", "Top", "Right", "Bottom"]
            button%v% := NumGet(RECT, 4*(k - 1), "UInt")
         centerX := toolbarX + buttonLeft + (buttonRight - buttonLeft)//2
         centerY := toolbarY + buttonTop  + (buttonBottom - buttonTop)//2
         NumPut(centerX, POINT), NumPut(centerY, POINT, 4, "UInt")
         break
      }
   }
   Return !!found
}

DragIcon(pPOINT, hDestToolBar, speed) {
   WinGetPos, toolbarX, toolbarY, toolbarW, toolbarH, ahk_id %hDestToolBar%
   xIcon := NumGet(pPOINT + 0, "UInt"), yIcon := NumGet(pPOINT + 4, "UInt")
   MouseMove, xIcon, yIcon, 0
   MouseClickDrag, L, xIcon, yIcon, toolbarX + toolbarW//2, toolbarY + toolbarH//2, speed
}
 
HideScene() {
   Gui, New, -Caption +AlwaysOnTop +ToolWindow +LastFound +hwndhGui
   WinSet, Transparent, 255
   Gui, +E0x20
   Gui, Margin, 0, 0
   Gui, Add, Pic,, % "HBITMAP:" . GetHBitmapFromScreen()
   Gui, Show, NA x0 y0
   Return hGui
}

GetHBitmapFromScreen() {
   Sysget, x, 76
   Sysget, y, 77
   Sysget, w, 78
   Sysget, h, 79

   hDC := DllCall("GetDC", "Ptr", 0, "Ptr")
   hBM := DllCall("CreateCompatibleBitmap", "Ptr", hDC, "Int", W, "Int", H, "Ptr")
   hMDC := DllCall("CreateCompatibleDC", "Ptr", hDC, "Ptr")
   hObj := DllCall("SelectObject", "Ptr", hMDC, "Ptr", hBM)
   DllCall("BitBlt", "Ptr", hMDC, "Int", 0, "Int", 0, "Int", W, "Int", H
                   , "Ptr", hDC, "Int", X, "Int", Y, "UInt", SRCCOPY := 0x00CC0020)
   DllCall("SelectObject", "Ptr", hMDC, "Ptr", hObj)
   DllCall("DeleteDC", "Ptr", hMDC)
   DllCall("ReleaseDC", "Ptr", 0, "Ptr", hDC)
   Return hBM
}

CreateCursor() {
   base64 := GetCursor()
   Return CreateIconFromBase64(base64, 16)
}

ReplaceSystemCursors(IDC = "")
{
   static IMAGE_CURSOR := 2, SPI_SETCURSORS := 0x57
        , exitFunc := Func("ReplaceSystemCursors").Bind("")
        , SysCursors := { IDC_APPSTARTING: 32650
                        , IDC_ARROW      : 32512
                        , IDC_CROSS      : 32515
                        , IDC_HAND       : 32649
                        , IDC_HELP       : 32651
                        , IDC_IBEAM      : 32513
                        , IDC_NO         : 32648
                        , IDC_SIZEALL    : 32646
                        , IDC_SIZENESW   : 32643
                        , IDC_SIZENWSE   : 32642
                        , IDC_SIZEWE     : 32644
                        , IDC_SIZENS     : 32645 
                        , IDC_UPARROW    : 32516
                        , IDC_WAIT       : 32514 }
   if !IDC {
      DllCall("SystemParametersInfo", "UInt", SPI_SETCURSORS, "UInt", 0, "UInt", 0, "UInt", 0)
      OnExit(exitFunc, 0)
   }
   else  {
      if !(IDC + 0)
         hCursor := DllCall("LoadCursor", "Ptr", 0, "UInt", SysCursors[IDC], "Ptr")
      for k, v in SysCursors  {
         (IDC + 0 && hCursor := IDC)
         hCopy := DllCall("CopyImage", "Ptr", hCursor, "UInt", IMAGE_CURSOR, "Int", 0, "Int", 0, "UInt", 0, "Ptr")
         DllCall("SetSystemCursor", "Ptr", hCopy, "UInt", v)
      }
      OnExit(exitFunc)
   }
}

CreateIconFromBase64(StringBASE64, Size)
{
   StringBase64ToData(StringBASE64, IconData)
   Return DllCall("CreateIconFromResourceEx", Ptr, &IconData + 4
      , "UInt", NumGet(&IconData, "UInt"), "UInt", true, "UInt", 0x30000, "Int", Size, "Int", Size, "UInt", 0)
}
   
StringBase64ToData(StringBase64, ByRef OutData)
{
   DllCall("Crypt32.dll\CryptStringToBinary", Ptr, &StringBase64 
      , "UInt", StrLen(StringBase64), "UInt", CRYPT_STRING_BASE64 := 1, "UInt", 0, "UIntP", Bytes, "UIntP", 0, "UIntP", 0)

   VarSetCapacity(OutData, Bytes)
   DllCall("Crypt32.dll\CryptStringToBinary", Ptr, &StringBase64 
      , "UInt", StrLen(StringBase64), "UInt", CRYPT_STRING_BASE64, "Str", OutData, "UIntP", Bytes, "UIntP", 0, "UIntP", 0)
   Return Bytes
}

class RemoteBuffer
{
   __New(PID, size) {
      static flags := (PROCESS_VM_OPERATION := 0x8) | (PROCESS_VM_WRITE := 0x20) | (PROCESS_VM_READ := 0x10)
           , Params := ["UInt", MEM_COMMIT := 0x1000, "UInt", PAGE_READWRITE := 0x4, "Ptr"]
         
      if !this.hProc := DllCall("OpenProcess", "UInt", flags, "Int", 0, "UInt", PID, "Ptr")
         throw Exception("Can't open remote process PID = " . PID . "`nA_LastError: " . A_LastError, "RemoteBuffer.__New")
      
      if !this.ptr := DllCall("VirtualAllocEx", "Ptr", this.hProc, "Ptr", 0, "Ptr", size, Params*) {
         DllCall("CloseHandle", "Ptr", this.hProc)
         throw Exception("Can't allocate memory in remote process PID = " . PID . "`nA_LastError: " . A_LastError, "RemoteBuffer.__New")
      }
   }
   
   __Delete() {
      DllCall("VirtualFreeEx", "Ptr", this.hProc, "Ptr", this.ptr, "UInt", 0, "UInt", MEM_RELEASE := 0x8000)
      DllCall("CloseHandle", "Ptr", this.hProc)
   }
   
   Read(ByRef localBuff, size, offset = 0) {
      VarSetCapacity(localBuff, size, 0)
      if !DllCall("ReadProcessMemory", "Ptr", this.hProc, "Ptr", this.ptr + offset, "Ptr", &localBuff, "Ptr", size, "PtrP", bytesRead)
         throw Exception("Can't read data from remote buffer`nA_LastError: " . A_LastError, "RemoteBuffer.Read")
      Return bytesRead
   }
   
   Write(pData, size, offset = 0) {
      if !res := DllCall("WriteProcessMemory", "Ptr", this.hProc, "Ptr", this.ptr + offset, "Ptr", pData, "Ptr", size, "PtrP", bytesWritten)
         throw Exception("Can't write data to remote buffer`nA_LastError: " . A_LastError, "RemoteBuffer.Write")
      Return bytesWritten
   }
}

GetCursor() {
   Cur16 = 
   (LTrim Join
      aAQAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      AAAAAAAAAAAAAAAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
      //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAA==
   )
   Return Cur16
}
Last edited by teadrinker on 10 Nov 2020, 04:20, edited 1 time in total.
User avatar
JoeWinograd
Posts: 2213
Joined: 10 Feb 2014, 20:00
Location: U.S. Central Time Zone

Re: Is there a way to put an icon outside the hidden tray icons by default?

09 Nov 2020, 20:29

teadrinker wrote:For Skype.exe
Hi teadrinker,
Thanks for that example. Works fine with my programs, too, but you are right, of course, that moving from the overflow tray to the main tray is visible. Regards, Joe

Return to “Ask for Help (v1)”

Who is online

Users browsing this forum: No registered users and 123 guests