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...
Is there a way to put an icon outside the hidden tray icons by default?
-
- 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?
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
}
Re: Is there a way to put an icon outside the hidden tray icons by default?
Your code dont work with 2 running ahk processes.
-
- 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?
What do you mean? I have a lot of running ahk processes.
Re: Is there a way to put an icon outside the hidden tray icons by default?
Tested more times.
For me it works unreliable.
For me it works unreliable.
-
- 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?
For me works well on two computers. You can try decreasing mouse speed in the script.
Re: Is there a way to put an icon outside the hidden tray icons by default?
1) Compile Your script
2) Run it - It appears in notification area.
3) Press f1 - appears white flash - nothing happens.
2) Run it - It appears in notification area.
3) Press f1 - appears white flash - nothing happens.
Re: Is there a way to put an icon outside the hidden tray icons by default?
It cannot find icon
Code: Select all
if !GetMyTrayIconInfo(showHide ? hToolbarNotifyIconOverflowWindow : hToolbarTrayNotifyWnd, POINT := 1, hIcon)
{
msgbox not found
}
-
- 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?
Weird, for me it works:
- 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?
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
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
Re: Is there a way to put an icon outside the hidden tray icons by default?
Tooltip You can get manually.
Try decrease speed:
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)
}
- 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?
Hi malcev,malcev wrote:Tooltip You can get manually
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)
Code: Select all
tooltip:=accOverflowNotificationArea.accName(A_Index)
if (InStr(tooltip,program))
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.malcev wrote:Try decrease speed
Thanks for your help. Regards, Joe
Re: Is there a way to put an icon outside the hidden tray icons by default?
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.
https://docs.microsoft.com/en-us/windows/win32/winauto/name-property
Name property of tray icon is equal its tooltip.
- 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?
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, Joemalcev wrote:It is not tooltip, it is name property.
- 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?
Hi teadrinker,teadrinker wrote:for me it works
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
-
- 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?
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:
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.
- 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?
Hi teadrinker,teadrinker wrote:For Skype.exe
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
Who is online
Users browsing this forum: No registered users and 123 guests