wraithdu Posted December 16, 2008 Posted December 16, 2008 (edited) I've been looking for a replacement function for TrayTip() because it flickers horribly on Vista when updating it. The ToolTip() function with a Title and Icon is almost there, but the built-in AutoIt function does not allow you to position it over the systray icons - the arrow is either up in the air, or the tip is below the desktop bounds. So I rewrote it so I could control the tooltip window properties a little better. Here's what I came up with. It updates smooth as butter on Vista. It uses Tuape's SysTray_UDF to get the location of the systray icon. I included it in the script for simplicity. expandcollapse popup#include <winapi.au3> #include <guitooltip.au3> #include <WindowsConstants.au3> ;; SysTray_UDF Globals Const $TB_DELETEBUTTON = 1046 Const $TB_GETBUTTON = 1047 Const $TB_BUTTONCOUNT = 1048 Const $TB_GETBUTTONTEXT = 1099 Const $TB_GETBUTTONINFO = 1089 Const $TB_HIDEBUTTON = 1028 ; WM_USER +4 Const $TB_GETITEMRECT = 1053 Const $TB_MOVEBUTTON = 1106 ; WM_USER +82 ;~ Const $WM_GETTEXT = 13 ; Included in GUIConstants Const $PROCESS_ALL_ACCESS = 2035711 Const $NO_TITLE = "---No title---" ; text that is used when icon window has no title $idx = _SysTrayIconIndex(@AutoItPID, 2) $pos = _SysTrayIconPos($idx) $pos[0] += 8 $pos[1] += 8 ; bad example 1, tip below desktop ToolTip("Icon position:" & @CRLF & "x: " & $pos[0] & @CRLF & "y: " & $pos[1], $pos[0], $pos[1], "Icon Pos:", 1, 1) Sleep(3000) ; bad example 2, tip arrow in wrong place ToolTip("Icon position:" & @CRLF & "x: " & $pos[0] & @CRLF & "y: " & $pos[1], $pos[0], $pos[1], "Icon Pos:", 1, 1 + 4) Sleep(3000) ToolTip("") ; the good stuff ; other possible styles - $TTS_CLOSE, $TTS_USEVISUALSTYLE (themed hyperlinks) $hTool = _WinAPI_CreateWindowEx($WS_EX_TOPMOST, "tooltips_class32", 0, BitOR($TTS_ALWAYSTIP, $TTS_NOPREFIX, $TTS_BALLOON), 0, 0, 0, 0, 0) _GUIToolTip_AddTool($hTool, 0, "Icon position:" & @CRLF & "x: " & $pos[0] & @CRLF & "y: " & $pos[1], 0, 0, 0, 0, 0, 16 + 128, 0) ; 16 = TTF_TRACK, 128 = TTF_PARSELINKS _GUIToolTip_SetTitle($hTool, "Icon Pos:", 1) ; set title and info icon _GUIToolTip_SetMaxTipWidth($hTool, 500) ; max width _GUIToolTip_TrackPosition($hTool, $pos[0], $pos[1]) ; tooltip position _GUIToolTip_TrackActivate($hTool) Sleep(3000) _GUIToolTip_SetTitle($hTool, "Text Updates:", 2) For $i = 1 To 10 _GUIToolTip_UpdateTipText($hTool, 0, 0, "My new text: " & $i) Sleep(250) Next _GUIToolTip_SetTitle($hTool, "Follow Mouse:", 1) $m_callback = DllCallbackRegister("_move", "long", "int;wparam;lparam") $pm_callback = DllCallbackGetPtr($m_callback) $hook = _WinAPI_SetWindowsHookEx($WH_MOUSE_LL, $pm_callback, 0) MouseMove(@DesktopWidth / 2, @DesktopHeight / 2) Sleep(10000) _WinAPI_UnhookWindowsHookEx($hook) DllCallbackFree($m_callback) _WinAPI_DestroyWindow($hTool) Exit Func _move($nCode, $wparam, $lparam) Switch $wparam Case $WM_MOUSEMOVE Local $pos = DllStructCreate("long;long", $lparam) $x = DllStructGetData($pos, 1) $y = DllStructGetData($pos, 2) _GUIToolTip_TrackPosition($hTool, $x, $y) _GUIToolTip_UpdateTipText($hTool, 0, 0, "Pos: " & $x & " x " & $y) EndSwitch Return _WinAPI_CallNextHookEx($hook, $nCode, $wparam, $lparam) EndFunc ;; ======================= SysTray_UDF by Tuape =============================== ; slightly modified _SysTrayIconIndex() to accept a PID ; ---------------------------------------------------------------------------- ; ; AutoIt Version: 3.1.1 Beta ; Author: Tuape ; ; Script Function: ; Systray UDF - Functions for reading icon info from system tray / removing ; any icon. ; ; Last Update: 7/14/05 ; Requirements: AutoIt3 Beta - tested on WindowsXP, might also work in win2000 ; ; Functions: ; _SysTrayIconCount() - Get count of all systray icons ; _SysTrayIconTitles() - Get titles of all programs that have icon on systray ; _SysTrayIconProcesses() - Get list of all process names that have icon in systray (hidden or visible) ; _SysTrayIconPids() - Get list of all parent process id's that own an icon in systray (hidden or visible) ; _SysTrayIconRemove($index) - Remove icon (removes completely, not just hide) ; _SysTrayIconIndex($wintitle or $process) - Get icon index based on process name or wintitle ; _SysTrayIconTooltip($index) - Get tooltip text of an icon based on index ; ; Notes: ; Some systray icons are actually hidden, so _SysTrayIconCount will probably return more than you see on systray. ; Some icons don't have window title on them. However, _SysTrayIconPids() & _SysTrayIconProcesses ; do return correct (parent) pid or process name ; ---------------------------------------------------------------------------- ;; globals moved to top ;; ;=============================================================================== ; ; Function Name: _SysTrayIconTitles() ; Description: Get list of all window titles that have systray icon ; Parameter(s): None ; Requirement(s): AutoIt3 Beta ; Return Value(s): On Success - Returns an array with all window titles ; On Failure - TO BE DONE ; Author(s): Tuape ; ;=============================================================================== Func _SysTrayIconTitles() Local $i Local $j Local $max = _SysTrayIconCount() Local $info[$max] Local $titles[$max] Local $var ; Get info (hwnd) of all icons For $i=0 to $max-1 $info[$i] = _SysTrayIconHandle($i) Next ; Get window title text $var = WinList() For $i = 0 to $max-1 For $j = 1 to $var[0][0] ;If $info[$i] = Dec($var[$j][1]) Then If $info[$i] = HWnd($var[$j][1]) Then If $var[$j][0] <> "" Then $titles[$i] = $var[$j][0] Else $titles[$i] = $NO_TITLE EndIf ExitLoop EndIf Next Next return $titles EndFunc ;=============================================================================== ; ; Function Name: _SysTrayIconProcesses() ; Description: Get list of all processes that have systray icon ; Parameter(s): None ; Requirement(s): AutoIt3 Beta ; Return Value(s): On Success - Returns an array with all process names ; On Failure - TO BE DONE ; Author(s): Tuape ; ;=============================================================================== Func _SysTrayIconProcesses() Local $i Local $j Local $pids = _SysTrayIconPids() Local $processes[UBound($pids)] Local $list ; List all processes $list = ProcessList() For $i = 0 to Ubound($pids)-1 For $j = 1 To $list[0][0] If $pids[$i] = $list[$j][1] Then $processes[$i] = $list[$j][0] ExitLoop EndIf Next Next return $processes EndFunc ;_SysTrayIconProcesses() ;=============================================================================== ; ; Function Name: _SysTrayIconPids() ; Description: Get list of all processes id's that have systray icon ; Parameter(s): None ; Requirement(s): AutoIt3 Beta ; Return Value(s): On Success - Returns an array with all process id's ; On Failure - TO BE DONE ; Author(s): Tuape ; ;=============================================================================== Func _SysTrayIconPids() Local $i Local $titles = _SysTrayIconTitles() Local $processes[UBound($titles)] Local $ret For $i=0 to Ubound($titles)-1 If $titles[$i] <> $NO_TITLE Then $processes[$i] = WinGetProcess($titles[$i]) Else ; Workaround for systray icons that have no title $ret = DLLCall("user32.dll","int","GetWindowThreadProcessId", "int", _SysTrayIconHandle($i), "int*", -1) If Not @error Then $processes[$i] = $ret[2] EndIf EndIf Next return $processes EndFunc ;=============================================================================== ; ; Function Name: _SysTrayIconIndex($name, $mode=0) ; Description: Get list of all processes id's that have systray icon ; Parameter(s): $name = process name / window title text ; $mode 0 = get index by process name (default) ; 1 = get index by window title ; 2 = get index by process PID ; Requirement(s): AutoIt3 Beta ; Return Value(s): On Success - Returns index of found icon ; On Failure - Returns -1 if icon for given process/wintitle ; was not found. ; - Sets error to 1 and returns -1 in case of bad ; arguments ; Author(s): Tuape ; ;=============================================================================== Func _SysTrayIconIndex($name, $mode=0) Local $index = -1 Local $process Local $i If $mode < 0 or $mode > 2 or Not IsInt($mode) Then SetError(1) return -1 EndIf If $mode = 0 Then $process = _SysTrayIconProcesses() ElseIf $mode = 1 Then $process = _SysTrayIconTitles() ElseIf $mode = 2 Then $process = _SysTrayIconPids() EndIf For $i = 0 to Ubound($process)-1 If $process[$i] = $name Then $index = $i EndIf Next return $index EndFunc ;=============================================================================== ; ; Function Name: _SysTrayIconPos($iIndex=0) ; Description: Gets x & y position of systray icon ; Parameter(s): $iIndex = icon index (Note: starting from 0) ; ; Requirement(s): AutoIt3 Beta ; Return Value(s): On Success - Returns x [0] and y [1] position of icon ; On Failure - Returns -1 if icon is hidden (Autohide on XP etc.) ; Sets error to 1 if some internal error happens ; ; Author(s): Tuape ; ;=============================================================================== Func _SysTrayIconPos($iIndex=0) ;========================================================= ; Create the struct _TBBUTTON ; struct { ; int iBitmap; ; int idCommand; ; BYTE fsState; ; BYTE fsStyle; ; ; #ifdef _WIN64 ; BYTE bReserved[6] // padding for alignment ; #elif defined(_WIN32) ; BYTE bReserved[2] // padding for alignment ; #endif ; DWORD_PTR dwData; ; INT_PTR iString; ; } ;========================================================= Local $str = "int;int;byte;byte;byte[2];dword;int" Dim $TBBUTTON = DllStructCreate($str) Dim $TBBUTTON2 = DllStructCreate($str) Dim $ExtraData = DllStructCreate("dword[2]") Dim $lpData DIM $RECT Local $pId Local $text Local $procHandle Local $index = $iIndex Local $bytesRead Local $info Local $pos[2] Local $hidden = 0 Local $trayHwnd Local $ret $trayHwnd = _FindTrayToolbarWindow() If $trayHwnd = -1 Then $TBBUTTON = 0 $TBBUTTON2 = 0 $ExtraData = 0 SetError(1) Return -1 EndIf $ret = DLLCall("user32.dll","int","GetWindowThreadProcessId", "hwnd", $trayHwnd, "int*", -1) If Not @error Then $pId = $ret[2] Else ConsoleWrite("Error: Could not find toolbar process id, " & @error & @LF) $TBBUTTON = 0 $TBBUTTON2 = 0 $ExtraData = 0 SetError(1) Return -1 EndIf $procHandle = DllCall("kernel32.dll", 'int', 'OpenProcess', 'int', $PROCESS_ALL_ACCESS, 'int', False, 'int', $pId) If @error Then ConsoleWrite("Error: Could not read toolbar process memory, " & @error & @LF) $TBBUTTON = 0 $TBBUTTON2 = 0 $ExtraData = 0 SetError(1) return -1 EndIf $lpData = DLLCall("kernel32.dll","int","VirtualAllocEx", "int", $procHandle[0], "int", 0, "int", DllStructGetSize ( $TBBUTTON ), "int", 0x1000, "int", 0x04) If @error Then ConsoleWrite(@CRLF & "VirtualAllocEx Error" & @LF) $TBBUTTON = 0 $TBBUTTON2 = 0 $ExtraData = 0 SetError(1) Return -1 Else DLLCall("user32.dll","int","SendMessage", "hwnd", $trayHwnd, "int", $TB_GETBUTTON, "int", $index, "ptr",$lpData[0]) DllCall('kernel32.dll', 'int', 'ReadProcessMemory', 'int', $procHandle[0], 'int', $lpData[0], 'ptr', DllStructGetPtr($TBBUTTON2), 'int', DllStructGetSize( $TBBUTTON), 'int', $bytesRead) DllCall('kernel32.dll', 'int', 'ReadProcessMemory', 'int', $procHandle[0], 'int', DllStructGetData($TBBUTTON2,6), 'int', DllStructGetPtr($ExtraData), 'int', DllStructGetSize( $ExtraData), 'int', $bytesRead) $info = DllStructGetData($ExtraData,1,1) If Not BitAND(DllStructGetData($TBBUTTON2,3), 8) Then ; 8 = TBHIDDEN $str = "int;int;int;int" $RECT = DllStructCreate($str) DLLCall("user32.dll","int","SendMessage", "hwnd", $trayHwnd, "int", $TB_GETITEMRECT, "int", $index, "ptr",$lpData[0]) DllCall('kernel32.dll', 'int', 'ReadProcessMemory', 'int', $procHandle[0], 'int', $lpData[0], 'ptr', DllStructGetPtr($RECT), 'int', DllStructGetSize($RECT), 'int', $bytesRead) $ret = DLLCall("user32.dll","int","MapWindowPoints", "hwnd", $trayHwnd, "int", 0, 'ptr', DllStructGetPtr($RECT), "int",2) ConsoleWrite("Info: " & $info & "RECT[0](left): " & DllStructGetData($RECT,1) & "RECT[1](top): " & DllStructGetData($RECT,2) & "RECT[2](right): " & DllStructGetData($RECT,3) & "RECT[3](bottom): " & DllStructGetData($RECT,4) & @LF) ;MouseMove(DllStructGetData($RECT,1),DllStructGetData($RECT,2)) ;Sleep(1000) ;MouseClick("left") $pos[0] = DllStructGetData($RECT,1) $pos[1] = DllStructGetData($RECT,2) $RECT = 0 Else $hidden = 1 EndIf DLLCall("kernel32.dll","int","VirtualFreeEx", "int", $procHandle[0], "ptr", $lpData[0], "int", 0, "int", 0x8000) ;DllStructGetSize ( $TBBUTTON ), "int", 0x8000) EndIf DllCall('kernel32.dll', 'int', 'CloseHandle', 'int', $procHandle[0]) $TBBUTTON = 0 $TBBUTTON2 = 0 $ExtraData = 0 If $hidden <> 1 Then return $pos Else Return -1 EndIf EndFunc ;=============================================================================== ; ; Function Name: _SysTrayIconHandle($iIndex=0) ; Description: Utility function. Gets hwnd of window associated with ; systray icon of given index ; Parameter(s): $iIndex = icon index (Note: starting from 0) ; ; Requirement(s): AutoIt3 Beta ; Return Value(s): On Success - Returns hwnd of found icon ; On Failure - Returns -1 in error situations ; ; Author(s): Tuape ; ;=============================================================================== Func _SysTrayIconHandle($iIndex=0) ;========================================================= ; Create the struct _TBBUTTON ; struct { ; int iBitmap; ; int idCommand; ; BYTE fsState; ; BYTE fsStyle; ; ; #ifdef _WIN64 ; BYTE bReserved[6] // padding for alignment ; #elif defined(_WIN32) ; BYTE bReserved[2] // padding for alignment ; #endif ; DWORD_PTR dwData; ; INT_PTR iString; ; } ;========================================================= Local $str = "int;int;byte;byte;byte[2];dword;int";char[128]" Dim $TBBUTTON = DllStructCreate($str) Dim $TBBUTTON2 = DllStructCreate($str) Dim $ExtraData = DllStructCreate("dword[2]") Local $pId Local $text Local $procHandle Local $index = $iIndex Local $bytesRead Local $info Local $lpData Local $trayHwnd $trayHwnd = _FindTrayToolbarWindow() If $trayHwnd = -1 Then $TBBUTTON = 0 $TBBUTTON2 = 0 $ExtraData = 0 SetError(1) Return -1 EndIf Local $ret = DLLCall("user32.dll","int","GetWindowThreadProcessId", "hwnd", $trayHwnd, "int*", -1) If Not @error Then $pId = $ret[2] Else ConsoleWrite("Error: Could not find toolbar process id, " & @error & @LF) $TBBUTTON = 0 $TBBUTTON2 = 0 $ExtraData = 0 Return -1 EndIf $procHandle = DllCall("kernel32.dll", 'int', 'OpenProcess', 'int', $PROCESS_ALL_ACCESS, 'int', False, 'int', $pId) If @error Then ConsoleWrite("Error: Could not read toolbar process memory, " & @error & @LF) $TBBUTTON = 0 $TBBUTTON2 = 0 $ExtraData = 0 return -1 EndIf $lpData = DLLCall("kernel32.dll","int","VirtualAllocEx", "int", $procHandle[0], "int", 0, "int", DllStructGetSize ( $TBBUTTON ), "int", 0x1000, "int", 0x04) If @error Then ConsoleWrite("VirtualAllocEx Error" & @LF) $TBBUTTON = 0 $TBBUTTON2 = 0 $ExtraData = 0 Return -1 Else DLLCall("user32.dll","int","SendMessage", "hwnd", $trayHwnd, "int", $TB_GETBUTTON, "int", $index, "ptr", $lpData[0]);e(hwnd, TB_GETBUTTON, index, (LPARAM)lpData); DllCall('kernel32.dll', 'int', 'ReadProcessMemory', 'int', $procHandle[0], 'int', $lpData[0], 'ptr', DllStructGetPtr($TBBUTTON2), 'int', DllStructGetSize( $TBBUTTON), 'int', $bytesRead) DllCall('kernel32.dll', 'int', 'ReadProcessMemory', 'int', $procHandle[0], 'int', DllStructGetData($TBBUTTON2,6), 'int', DllStructGetPtr($ExtraData), 'int', DllStructGetSize( $ExtraData), 'int', $bytesRead);_MemRead($procHandle, $lpData[0], DllStructGetSize( $TBBUTTON)) $info = DllStructGetData($ExtraData,1) DLLCall("kernel32.dll","int","VirtualFreeEx", "int", $procHandle[0], "ptr", $lpData[0], "int", 0, "int", 0x8000) ;DllStructGetSize ( $TBBUTTON ), "int", 0x8000) EndIf DllCall('kernel32.dll', 'int', 'CloseHandle', 'int', $procHandle[0]) $TBBUTTON = 0 $TBBUTTON2 = 0 $ExtraData = 0 $lpData = 0 return $info EndFunc ;=============================================================================== ; ; Function Name: _SysTrayIconTooltip($iIndex=0) ; Description: Utility function. Gets the tooltip text of ; systray icon of given index ; Parameter(s): $iIndex = icon index (Note: starting from 0) ; ; Requirement(s): AutoIt3 Beta ; Return Value(s): On Success - Returns tooltip text of icon ; On Failure - Returns -1 in error situations ; ; Author(s): Tuape ; ;=============================================================================== Func _SysTrayIconTooltip($iIndex=0) ;========================================================= ; Create the struct _TBBUTTON ; struct { ; int iBitmap; ; int idCommand; ; BYTE fsState; ; BYTE fsStyle; ; ; #ifdef _WIN64 ; BYTE bReserved[6] // padding for alignment ; #elif defined(_WIN32) ; BYTE bReserved[2] // padding for alignment ; #endif ; DWORD_PTR dwData; ; INT_PTR iString; ; } ;========================================================= Local $str = "int;int;byte;byte;byte[2];dword;int" Dim $TBBUTTON = DllStructCreate($str) Dim $TBBUTTON2 = DllStructCreate($str) Dim $ExtraData = DllStructCreate("dword[2]") Dim $intTip = DllStructCreate("short[1024]") Local $pId Local $text Local $procHandle Local $index = $iIndex Local $bytesRead Local $info Local $lpData Local $trayHwnd $trayHwnd = _FindTrayToolbarWindow() If $trayHwnd = -1 Then $TBBUTTON = 0 $TBBUTTON2 = 0 $ExtraData = 0 $intTip = 0 ;SetError(1) Return -1 EndIf Local $ret = DLLCall("user32.dll","int","GetWindowThreadProcessId", "hwnd", $trayHwnd, "int*", -1) If Not @error Then $pId = $ret[2] Else ConsoleWrite("Error: Could not find toolbar process id, " & @error & @LF) $TBBUTTON = 0 $TBBUTTON2 = 0 $ExtraData = 0 $intTip = 0 Return -1 EndIf $procHandle = DllCall("kernel32.dll", 'int', 'OpenProcess', 'int', $PROCESS_ALL_ACCESS, 'int', False, 'int', $pId) If @error Then ConsoleWrite("Error: Could not read toolbar process memory, " & @error & @LF) $TBBUTTON = 0 $TBBUTTON2 = 0 $ExtraData = 0 $intTip = 0 return -1 EndIf $lpData = DLLCall("kernel32.dll","int","VirtualAllocEx", "int", $procHandle[0], "int", 0, "int", DllStructGetSize ( $TBBUTTON ), "int", 0x1000, "int", 0x04) If @error Then ConsoleWrite("VirtualAllocEx Error" & @LF) $TBBUTTON = 0 $TBBUTTON2 = 0 $ExtraData = 0 $intTip = 0 Return -1 Else DLLCall("user32.dll","int","SendMessage", "hwnd", $trayHwnd, "int", $TB_GETBUTTON, "int", $index, "ptr",$lpData[0]);e(hwnd, TB_GETBUTTON, index, (LPARAM)lpData); DllCall('kernel32.dll', 'int', 'ReadProcessMemory', 'int', $procHandle[0], 'int', $lpData[0], 'ptr', DllStructGetPtr($TBBUTTON2), 'int', DllStructGetSize( $TBBUTTON), 'int', $bytesRead) DllCall('kernel32.dll', 'int', 'ReadProcessMemory', 'int', $procHandle[0], 'int', DllStructGetData($TBBUTTON2,7), 'int', DllStructGetPtr($intTip), 'int', DllStructGetSize( $intTip), 'int', 0);_MemRead($procHandle, $lpData[0], DllStructGetSize( $TBBUTTON)) ; go through every character $i = 1 While $i < 1024 $tipChar = "" #cs BOOL ReadProcessMemory( HANDLE hProcess, LPCVOID lpBaseAddress, LPVOID lpBuffer, SIZE_T nSize, SIZE_T* lpNumberOfBytesRead ); #ce $tipChar = Chr(DllStructGetData($intTip,1,$i)) If $tipChar = "" Then ExitLoop EndIf ;ConsoleWrite(@CRLF & $i & " Char: " & $tipChar & @LF) $info = $info & $tipChar $i = $i + 1 Wend If $info = "" Then $info = "No tooltip text" EndIf DLLCall("kernel32.dll","int","VirtualFreeEx", "int", $procHandle[0], "ptr", $lpData[0], "int", 0, "int", 0x8000) ;DllStructGetSize ( $TBBUTTON ), "int", 0x8000)) EndIf DllCall('kernel32.dll', 'int', 'CloseHandle', 'int', $procHandle[0]) $TBBUTTON = 0 $TBBUTTON2 = 0 $ExtraData = 0 $intTip = 0 $lpData = 0 return $info EndFunc ;=============================================================================== ; ; Function Name: _SysTrayIconCount ; Description: Utility function. Returns number of icons on systray ; Note: Hidden icons are also reported ; Parameter(s): None ; ; Requirement(s): AutoIt3 Beta ; Return Value(s): On Success - Returns number of icons found ; On Failure - Returns -1 ; ; Author(s): Tuape ; ;=============================================================================== Func _SysTrayIconCount() Local $hWnd = _FindTrayToolbarWindow() Local $count = 0 $count = DLLCall("user32.dll","int","SendMessage", "hwnd", $hWnd, "int", $TB_BUTTONCOUNT, "int", 0, "int", 0) If @error Then Return -1 return $count[0] EndFunc ;=============================================================================== ; ; Function Name: _SysTrayIconVisible($flag, $index) ; Description: Hides / unhides any icon on systray ; ; Parameter(s): $flag = hide (1) or show (0) icon ; $index = icon index. Can be queried with _SysTrayIconIndex() ; ; Requirement(s): AutoIt3 Beta ; Return Value(s): On Success - Returns 1 if operation was successfull / 0 if ; icon was already hidden/unhidden ; On Failure - If invalid parameters, returns -1 and sets error ; to 1 ; ; Author(s): Tuape ; ;=============================================================================== Func _SysTrayIconVisible($flag, $index) If $flag < 0 or $flag > 1 or Not IsInt($flag) Then SetError(1) return -1 EndIf Local $hWnd = _FindTrayToolbarWindow() Local $return Local $str = "int;int;byte;byte;byte[2];dword;int";char[128]" Dim $TBBUTTON = DllStructCreate($str) Dim $TBBUTTON2 = DllStructCreate($str) Local $pId Local $text Local $procHandle Local $bytesRead Local $info Local $lpData Local $ret = DLLCall("user32.dll","int","GetWindowThreadProcessId", "hwnd", $hWnd, "int*", -1) If Not @error Then $pId = $ret[2] Else ConsoleWrite("Error: Could not find toolbar process id, " & @error & @LF) $TBBUTTON = 0 $TBBUTTON2 = 0 Return -1 EndIf $procHandle = DllCall("kernel32.dll", 'int', 'OpenProcess', 'int', $PROCESS_ALL_ACCESS, 'int', False, 'int', $pId) If @error Then ConsoleWrite("Error: Could not read toolbar process memory, " & @error & @LF) $TBBUTTON = 0 $TBBUTTON2 = 0 return -1 EndIf $lpData = DLLCall("kernel32.dll","int","VirtualAllocEx", "int", $procHandle[0], "int", 0, "int", DllStructGetSize ( $TBBUTTON ), "int", 0x1000, "int", 0x04) If @error Then ConsoleWrite("VirtualAllocEx Error" & @LF) $TBBUTTON = 0 $TBBUTTON2 = 0 Return -1 Else DLLCall("user32.dll","int","SendMessage", "hwnd", $hWnd, "int", $TB_GETBUTTON, "int", $index, "ptr",$lpData[0]);e(hwnd, TB_GETBUTTON, index, (LPARAM)lpData); DllCall('kernel32.dll', 'int', 'ReadProcessMemory', 'int', $procHandle[0], 'int', $lpData[0], 'ptr', DllStructGetPtr($TBBUTTON2), 'int', DllStructGetSize( $TBBUTTON), 'int', $bytesRead) $return = DLLCall("user32.dll","int","SendMessage", "hwnd", $hWnd, "int", $TB_HIDEBUTTON, "int", DllStructGetData($TBBUTTON2,2), "long", $flag) ;ConsoleWrite(@CRLF & "Return: " & $return[0]) DLLCall("kernel32.dll","int","VirtualFreeEx", "int", $procHandle[0], "ptr", $lpData[0], "int", 0, "int", 0x8000) ;DllStructGetSize ( $TBBUTTON ), "int", 0x8000) DllCall('kernel32.dll', 'int', 'CloseHandle', 'int', $procHandle[0]) EndIf $TBBUTTON = 0 $TBBUTTON2 = 0 return $return[0] EndFunc ;=============================================================================== ; ; Function Name: _SysTrayIconmove($curPos, $newPos) ; Description: Moves systray icon ; ; Parameter(s): $curPos = icon's current index (0 based) ; $newPos = icon's new position ; ----> ($curPos+1 = one step to right, $curPos-1 = one step to left) ; ; Requirement(s): AutoIt3 Beta ; Return Value(s): On Success - Returns 1 if operation was successfull ; On Failure - If invalid parameters, returns -1 and sets error ; to 1 ; ; Author(s): Tuape ; ;=============================================================================== Func _SysTrayIconmove($curPos, $newPos) Local $iconCount = _SysTrayIconCount() If $curPos < 0 or $newPos < 0 or $curPos > $iconCount-1 or $newPos > $iconCount-1 or Not IsInt($curPos) or Not IsInt($newPos) Then SetError(1) return -1 EndIf Local $hWnd = _FindTrayToolbarWindow() Local $return Local $return = DLLCall("user32.dll","int","SendMessage", "hwnd", $hWnd, "int", $TB_MOVEBUTTON, "int", $curPos, "int",$newPos) return $return[0] EndFunc ;=============================================================================== ; ; Function Name: _SysTrayIconRemove($index=0 ; Description: Removes systray icon completely. ; ; Parameter(s): index = icon index. Can be queried with _SysTrayIconIndex() ; Default = 0 ; ; Requirement(s): AutoIt3 Beta ; Return Value(s): On Success - Returns 1 if icon successfully removed ; On Failure - Sets error to 1 and returns -1 ; ; Author(s): Tuape ; ;=============================================================================== Func _SysTrayIconRemove($index=0) If $index < 0 or $index > _SysTrayIconCount()-1 Then SetError(1) return -1 EndIf Local $hWnd = _FindTrayToolbarWindow() DLLCall("user32.dll","int","SendMessage", "hwnd", $hWnd, "int", $TB_DELETEBUTTON, "int", $index, "int", 0) If Not @error Then return 1 Else SetError(2) return -1 EndIf EndFunc ;=============================================================================== ; ; Function Name: _FindTrayToolbarWindow ; Description: Utility function for finding Toolbar window hwnd ; Parameter(s): None ; ; Requirement(s): AutoIt3 Beta ; Return Value(s): On Success - Returns Toolbar window hwnd ; On Failure - returns -1 ; ; Author(s): Tuape ; ;=============================================================================== Func _FindTrayToolbarWindow() Local $hWnd = DLLCall("user32.dll","hwnd","FindWindow", "str", "Shell_TrayWnd", "int", 0) if @error Then return -1 $hWnd = DLLCall("user32.dll","hwnd","FindWindowEx", "hwnd", $hWnd[0], "int", 0, "str", "TrayNotifyWnd", "int", 0);FindWindowEx(hWnd,NULL,_T("TrayNotifyWnd"), NULL); if @error Then return -1 If @OSVersion <> "WIN_2000" Then $hWnd = DLLCall("user32.dll","hwnd","FindWindowEx", "hwnd", $hWnd[0], "int", 0, "str", "SysPager", "int", 0);FindWindowEx(hWnd,NULL,_T("TrayNotifyWnd"), NULL); if @error Then return -1 EndIf $hWnd = DLLCall("user32.dll","hwnd","FindWindowEx", "hwnd", $hWnd[0], "int", 0, "str", "ToolbarWindow32", "int", 0);FindWindowEx(hWnd,NULL,_T("TrayNotifyWnd"), NULL); if @error Then return -1 Return $hWnd[0] EndFunc Edited December 16, 2008 by wraithdu
jennico Posted April 5, 2009 Posted April 5, 2009 does not work here xp sp2 ( _SysTrayIconPos() fails, but without console message ) is this only for vista maybe ? j. Spoiler I actively support Wikileaks | Freedom for Julian Assange ! | Defend freedom of speech ! | Fight censorship ! | I will not silence.Don't forget this IP: 213.251.145.96
GtaSpider Posted April 5, 2009 Posted April 5, 2009 Works great, and flicker free, on XP SP3.. Nice work Spider www.AutoIt.de - Moderator of the German AutoIt Forum
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now