OnMessage for WatchTrayTip

Get help with using AutoHotkey (v1.1 and older) and its commands and hotkeys
zcooler
Posts: 455
Joined: 11 Jan 2014, 04:59

OnMessage for WatchTrayTip

02 May 2016, 13:44

Hi!

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
}
Asmodeus
Posts: 57
Joined: 19 Oct 2015, 15:53

Re: OnMessage for WatchTrayTip

03 May 2016, 18:09

running the code crashes ahk 1.1.23.5 unicode 32-bit.
zcooler
Posts: 455
Joined: 11 Jan 2014, 04:59

Re: OnMessage for WatchTrayTip

04 May 2016, 08:16

I use ahk_h 1.1.23.5 unicode 32-bit and it works fine. My aim here is to avoid using a timer that stays on pretty much constantly taking up resources and perhaps trigger the check by monitoring some notification area message instead. But Im not sure how it works. Tried monitoring WM_NOTIFY for example but nothing happened.

Return to “Ask for Help (v1)”

Who is online

Users browsing this forum: Chunjee, Google [Bot], jeves and 171 guests