Im wondering if it might be possible, instead of using a timer, to monitor a system message (OnMessage) in order to get the TrayTip message? Everything I try seems to fail. Here's the original WatchTrayTip script:
Code: Select all
#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
#SingleInstance, Force
#Persistent
ExeName := "DVBVCtrl.exe" ; <<< Put the exe name here.
SetTimer, WatchTrayTip, 100
Return
WatchTrayTip:
TrayTip := GetTrayTip(ExeName)
If (TrayTip = "Turn Microphone Off")
MsgBox, The tray icon is green.
Else
MsgBox, The tray icon is red or yellow.
/*
DVBViewer Recording Service 1.32.0.0 (beta)
1 Timer(s) active.
DVBViewer Recording Service 1.32.0.0 (beta)
The service is idle.
DVBViewer Recording Service 1.32.0.0 (beta)
The service is stopped.
*/
Return
GetTrayTip(sProcess) {
TI := TrayIcons(sProcess)
StringSplit, TI, TI, |
Return SubStr(TI10, 11)
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
;~ Created by Sean, modified by zzzooo10
;~ Orginal Verison: http://www.autohotkey.com/forum/viewtopic.php?t=17314&start=0
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TrayIcons(sExeName = "", iHidden = 0, iSelf = 0)
{
DetectHiddenWindows, On
if iHidden
class := "NotifyIconOverflowWindow"
Else
class := "Shell_TrayWnd"
WinGet, pidTaskbar, PID, ahk_class %class%
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 %class% ; TB_BUTTONCOUNT
Loop, %ErrorLevel%
{
SendMessage, 0x417, A_Index-1, pProc, ToolbarWindow32%idxTB%, ahk_class %class% ; 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 . "| Hidden: " . iHidden . "`n" . " | Tooltip: " . wTooltip . "`n"
}
DllCall("VirtualFreeEx", "Uint", hProc, "Uint", pProc, "Uint", 0, "Uint", 0x8000)
DllCall("CloseHandle", "Uint", hProc)
if (!sTrayIcons) && (!self) ; If it wasnt found, check for it in the hidden icons tray
return TrayIcons(sExeName, 1, 1)
Return sTrayIcons
}
GetTrayBar(hidden=0)
{
if Hidden
class := "NotifyIconOverflowWindow"
Else
class := "Shell_TrayWnd"
ControlGet, hParent, hWnd,, TrayNotifyWnd1 , ahk_class %class%
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
}