 |
AutoHotkey Community Let's help each other out
|
| View previous topic :: View next topic |
| Author |
Message |
HotKeyIt
Joined: 18 Jun 2008 Posts: 2190 Location: GERMANY
|
Posted: Sun Jun 07, 2009 8:19 pm Post subject: [Lib] TrayIcon_...() |
|
|
Using this functions you can receive coordinates for a TrayIcon of any application.
Now you can hide and show an Icon as well.
To use this function you will need [module] RemoteBuffer 2.0 (RemoteBuf.ahk) in same folder as this script or in your Lib folder.
Many thanks to
- Irek Zielinski for CTrayIconPosition - where is my tray icon?
- majkinetor for RemoteBuffer
| Code: | /*
TrayIcon_GetPos
TrayIcon_GetPosByRef
Use: Using this function you can receive coordinates for a TrayIcon of any application
Syntax: GetTrayIconPos([PID]) - To get a PID use Process, Exist, application.exe, if ommited, PID of this script is used
Returns string "xn yn", n=coordinates in Pixel
SyntaxByRef:TrayIcon_GetPosByRef(x,y[,PID]) - x and y will be variables that will hold coordinates after function is called
TrayIcon_Hide
Use: Using this function you can hide and show a tray icon giving its PID
Syntax: TrayIcon_Hide(PID,1=hide or 0=show)
*/
MsgBox % TrayIcon_GetPos(4004) ;Returns coordinates string
MsgBox % "Hidden " TrayIcon_Hide("",1)
MsgBox % "Hidden " TrayIcon_Hide("",0)
;or
TrayIcon_GetPosByRef(x,y) ;save x and y coordinates in x and y variable
MsgBox % "x: " Round(x) "`ny: " Round(y)
ControlClick,% TrayIcon_GetPos(),ahk_class Shell_TrayWnd,,R
Sleep, 3000
;or
CoordMode,Mouse,screen
TrayIcon_GetPosByRef(x,y) ;save x and y coordinates in x and y variable
WinGetPos,xc,yc,,,ahk_class Shell_TrayWnd
x+=xc
y+=yc
Click R %x% %y%
MsgBox % "x: " Round(x) "`ny: " Round(y)
ExitApp
TrayIcon_Hide(PID="",hide=1){
If ((#_DetectHiddenWindows:=A_DetectHiddenWindows)="Off")
DetectHiddenWindows, On
If !PID
{
Process, Exist
PID:=ErrorLevel
}
hWndTray:=WinExist("ahk_class Shell_TrayWnd")
ControlGet,hWndToolBar,Hwnd,,ToolbarWindow321,ahk_id %hWndTray%
RemoteBuf_Open(TrayH,hWndToolBar,20)
DataH:=NumGet(TrayH,0)
SendMessage, 0x418,0,0,,ahk_id %hWndToolBar%
ErrorLvl:=ErrorLevel
Loop % ErrorLevel
{
SendMessage,0x417,A_Index-1,RemoteBuf_Get(TrayH),,ahk_id %hWndToolBar%
RemoteBuf_Read(TrayH,lpData,20)
pwData:=NumGet(lpData,12)
VarSetCapacity(dwExtraData,20)
DllCall( "ReadProcessMemory", "uint", DataH, "uint", pwData, "uint", &dwExtraData, "uint", 8, "uint", 0 )
BWID:=NumGet(dwExtraData,0)
WinGet,BWPID,PID, ahk_id %BWID%
If (BWPID!=PID)
continue
SendMessage, 0x404,ErrorLvl - A_Index,hide,,ahk_id %hWndToolBar%
break
}
RemoteBuf_close(TrayH)
DetectHiddenWindows, %#_DetectHiddenWindows%
Return hide
}
TrayIcon_GetPos(PID=""){
If ((#_DetectHiddenWindows:=A_DetectHiddenWindows)="Off")
DetectHiddenWindows, On
If !PID
{
Process, Exist
PID:=ErrorLevel
}
hWndTray:=WinExist("ahk_class Shell_TrayWnd")
ControlGet,hWndToolBar,Hwnd,,ToolbarWindow321,ahk_id %hWndTray%
RemoteBuf_Open(TrayH,hWndToolBar,20)
DataH:=NumGet(TrayH,0)
SendMessage, 0x418,0,0,,ahk_id %hWndToolBar%
Loop % ErrorLevel
{
SendMessage,0x417,A_Index-1,RemoteBuf_Get(TrayH),,ahk_id %hWndToolBar%
RemoteBuf_Read(TrayH,lpData,20)
pwData:=NumGet(lpData,12)
VarSetCapacity(dwExtraData,20)
DllCall( "ReadProcessMemory", "uint", DataH, "uint", pwData, "uint", &dwExtraData, "uint", 8, "uint", 0 )
BWID:=NumGet(dwExtraData,0)
WinGet,BWPID,PID, ahk_id %BWID%
If (BWPID!=PID)
continue
SendMessage, 0x41d,A_Index-1,RemoteBuf_Get(TrayH),,ahk_id %hWndToolBar%
RemoteBuf_Read(TrayH,rcPosition,20)
If (NumGet(lpData,8)>7){
ControlGetPos,x,y,w,h,Button2,ahk_id %hWndTray%
x+=w/2
y+=h/4
} else {
ControlGetPos,x,y,,,ToolbarWindow321,ahk_id %hWndTray%
halfsize:=NumGet(rcPosition,12)/2
x+=NumGet(rcPosition,0)+ halfsize
y+=NumGet(rcPosition,4)+ halfsize
}
}
RemoteBuf_close(TrayH)
DetectHiddenWindows, %#_DetectHiddenWindows%
Return "x" . Round(x) . " y" . Round(y)
}
TrayIcon_GetPosByRef(ByRef x, ByRef y,PID=""){
If ((#_DetectHiddenWindows:=A_DetectHiddenWindows)="Off")
DetectHiddenWindows, On
If !PID
{
Process, Exist
PID:=ErrorLevel
}
hWndTray:=WinExist("ahk_class Shell_TrayWnd")
ControlGet,hWndToolBar,Hwnd,,ToolbarWindow321,ahk_id %hWndTray%
RemoteBuf_Open(TrayH,hWndToolBar,20)
DataH:=NumGet(TrayH,0)
SendMessage, 0x418,0,0,,ahk_id %hWndToolBar%
Loop % ErrorLevel
{
SendMessage,0x417,A_Index-1,RemoteBuf_Get(TrayH),,ahk_id %hWndToolBar%
RemoteBuf_Read(TrayH,lpData,20)
pwData:=NumGet(lpData,12)
VarSetCapacity(dwExtraData,8)
DllCall( "ReadProcessMemory", "uint", DataH, "uint", pwData, "uint", &dwExtraData, "uint", 8, "uint", 0 )
BWID:=NumGet(dwExtraData,0)
WinGet,BWPID,PID, ahk_id %BWID%
If (BWPID!=PID)
continue
SendMessage, 0x41d,A_Index-1,RemoteBuf_Get(TrayH),,ahk_id %hWndToolBar%
RemoteBuf_Read(TrayH,rcPosition,20)
If (NumGet(lpData,8)>7){
ControlGetPos,x,y,w,h,Button2,ahk_id %hWndTray%
x+=w/2
y+=h/2
} else {
ControlGetPos,x,y,,,ToolbarWindow321,ahk_id %hWndTray%
halfsize:=NumGet(rcPosition,12)/2
x+=NumGet(rcPosition,0)+ halfsize
y+=NumGet(rcPosition,4)+ halfsize
}
}
RemoteBuf_close(TrayH)
DetectHiddenWindows, %#_DetectHiddenWindows%
} |
_________________ AutoHotFile - ToolTip(n,text,title,options)
Last edited by HotKeyIt on Fri Feb 26, 2010 11:31 pm; edited 6 times in total |
|
| Back to top |
|
 |
HotKeyIt
Joined: 18 Jun 2008 Posts: 2190 Location: GERMANY
|
|
| Back to top |
|
 |
pajenn
Joined: 07 Feb 2009 Posts: 349
|
Posted: Tue Jun 09, 2009 9:32 am Post subject: |
|
|
Very useful function.
I've been working on a substitute for Windows 'Safely Remove Hardware' tray function. This may be just the ticket to nail down some pop-up menus involved.
Just one question or observation: When I ran this for one of my icons, I got the coordinates, x995 y16. Are those relative coordinates for the task/tray bar? Or is the y-coordinate measured from the bottom of the screen? Would it not be better to just return the coordinates in screen mode to ease their use with various mouse move, mouse click, etc. commands? Then again, I suppose the y-coordinate is always the same for all icons, so it doesn't really matter. _________________ Hardware: 1.8 GHz laptop with 4 GB ram
Software: Windows XP/SP3, Rising Antivirus, Online Armor firewall, Dragon NaturallySpeaking Pro + Natlink (with Vocola/Unimacro) and AHK for macro support. |
|
| Back to top |
|
 |
HotKeyIt
Joined: 18 Jun 2008 Posts: 2190 Location: GERMANY
|
Posted: Tue Jun 09, 2009 10:10 am Post subject: |
|
|
| pajenn wrote: | Very useful function.
I've been working on a substitute for Windows 'Safely Remove Hardware' tray function. This may be just the ticket to nail down some pop-up menus involved.
Just one question or observation: When I ran this for one of my icons, I got the coordinates, x995 y16. Are those relative coordinates for the task/tray bar? Or is the y-coordinate measured from the bottom of the screen? Would it not be better to just return the coordinates in screen mode to ease their use with various mouse move, mouse click, etc. commands? Then again, I suppose the y-coordinate is always the same for all icons, so it doesn't really matter. |
Thanks pajenn.
The coordinates are relative to the window (Shell_TrayWnd).
To receive screen coordinates you will need only WinGetPos command and add values to x and y.
Especially for ControlClick you will need relative coordinates
| Code: | | ControlClick % TrayIcon_GetPos(),ahk_class Shell_TrayWnd,,R ;right click on scripts icon |
Y coordinates will be different only if you have several rows of icons! _________________ AutoHotFile - ToolTip(n,text,title,options)
Last edited by HotKeyIt on Mon Jul 06, 2009 6:32 pm; edited 1 time in total |
|
| Back to top |
|
 |
HotKeyIt
Joined: 18 Jun 2008 Posts: 2190 Location: GERMANY
|
|
| Back to top |
|
 |
Drugwash
Joined: 08 Sep 2008 Posts: 608 Location: Ploiesti, RO
|
Posted: Sat Jun 20, 2009 6:16 pm Post subject: |
|
|
| HotKeyIt wrote: | | Y coordinates will be different only if you have several rows of icons! | And also if the taskbar is positioned vertically, to the left or right.
There are also themes that change tray icon size; it may be useful to get the size too, although this may only interest a handful of people. |
|
| Back to top |
|
 |
HotKeyIt
Joined: 18 Jun 2008 Posts: 2190 Location: GERMANY
|
Posted: Sun Jun 21, 2009 10:35 am Post subject: |
|
|
| Drugwash wrote: | | HotKeyIt wrote: | | Y coordinates will be different only if you have several rows of icons! | And also if the taskbar is positioned vertically, to the left or right.
There are also themes that change tray icon size; it may be useful to get the size too, although this may only interest a handful of people. |
TrayIcon_GetPos already considers the size of those  _________________ AutoHotFile - ToolTip(n,text,title,options) |
|
| Back to top |
|
 |
|
|
You can post new topics in this forum You can reply to topics in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|