mhoisington Posted January 14, 2008 Share Posted January 14, 2008 I loaded the latest autoit v3 today Jan 14, 2008 and tested a problem I have been finding from several test machines, one using Vista and one using Windows XP, both on laptops. After running my test script, Windows Explorer crashes at random times. I have two different scripts, but the basic test does the following: This code clicks on a systray icon and waits for the application to change the systray tooltip. Systray_UDF.au3 appended. Please help for I am unable to continue testing without autoit causing explorer to crash. Thanks, -Mike Hoisington Blueridge Networks include <Misc.au3> #include "SysTray_UDF.au3" Opt("WinWaitDelay",100) Opt("WinTitleMatchMode",4) Opt("WinDetectHiddenText",1) Opt("MouseCoordMode",0) ;disconnect from the borderguard ;msgbox(0,"ok","ok") $log_file = "c:\mhtest\vlog.log" $vfile = FileOpen($log_file, 1) FileWriteLine($vfile, "Starting Test at: Month: " & @MON & " " & @MDAY & " " & @HOUR & ":" & @MIN) Opt("WinWaitDelay",100) Opt("WinTitleMatchMode",4) Opt("WinDetectHiddenText",1) Opt("MouseCoordMode",0) $iX = 1084 $iY = 12 $systray_string = _SysTrayIconTooltip(_SysTrayIconIndex("BRNClientTrayApp.exe")) msgbox(0,"tray",$systray_string) ;check_key() $connect_disconnect_count = 1 While 1 ; Delete the following section and then ; ; use Alt + F6 to create disconnect code here ; ; press alt+F6 then "click" to start recording keystrokes, then disconnect the client ; ; then click "stop" in the upper left corner ; ; ; Then do the same for connecting the client #region --- ScriptWriter generated code Start --- Opt("WinWaitDelay",100) Opt("WinTitleMatchMode",4) Opt("WinDetectHiddenText",1) Opt("MouseCoordMode",0) WinWait("classname=Shell_TrayWnd","") If Not WinActive("classname=Shell_TrayWnd","") Then WinActivate("classname=Shell_TrayWnd","") WinWaitActive("classname=Shell_TrayWnd","") MouseMove(1102,14) MouseDown("right") MouseMove(1101,14) MouseUp("right") WinWait("BRNCLIENTTRAY_{A4F0D159-1B3C-4a1e-BA63-D84663BB4849}","") If Not WinActive("BRNCLIENTTRAY_{A4F0D159-1B3C-4a1e-BA63-D84663BB4849}","") Then WinActivate("BRNCLIENTTRAY_{A4F0D159-1B3C-4a1e-BA63-D84663BB4849}","") WinWaitActive("BRNCLIENTTRAY_{A4F0D159-1B3C-4a1e-BA63-D84663BB4849}","") MouseMove(921,663) MouseDown("left") MouseUp("left") #endregion --- ScriptWriter generated code End --- ; ; ; end of disconnect code to add and delete for each test run ; $doing_syst_tray = 1 $systray_string = _SysTrayIconTooltip(_SysTrayIconIndex("BRNClientTrayApp.exe")) = _SysTrayIconTooltip(_SysTrayIconIndex("BRNClientTrayApp.exe")) $new_systray_string = $systray_string $doing_syst_tray = 1 $count = 1 ConsoleWrite($count & ": "& $systray_string & @CR) While ($doing_syst_tray = 1 ) $systray_string = _SysTrayIconTooltip(_SysTrayIconIndex("BRNClientTrayApp.exe")) $not_same = StringCompare ($systray_string, $new_systray_string ) If ($not_same <> 0 ) Then $new_systray_string = $systray_string ConsoleWrite($count & ": "& $systray_string& @CR) FileWriteLine( $vfile, $count & ": "& $systray_string& @CRLF) EndIf If ("Blue Ridge Networks VPN Disconnected" == $new_systray_string ) Then $doing_syst_tray = 0 $count = $count + 1 If ($count > 50 ) Then ;Msgbox ( 0,"Error", "Blue Ridge Networks VPN Disconnected not found " & $connect_disconnect_count, 1) FileWriteLine( $vfile, "Blue Ridge Networks VPN Disconnected not found " & $connect_disconnect_count) Exit Endif Sleep(100) check_key() Wend ;msgbox(0,"disconnected","disconnected, count, loop count "& $count & "," & $connect_disconnect_count, 1) FileWriteLine( $vfile, "disconnected, count, loop count "& $count & "," & $connect_disconnect_count) ; start of connect code to be deleted and added with Alt+F6 #region --- ScriptWriter generated code Start --- Opt("WinWaitDelay",100) Opt("WinTitleMatchMode",4) Opt("WinDetectHiddenText",1) Opt("MouseCoordMode",0) WinWait("classname=Shell_TrayWnd","") If Not WinActive("classname=Shell_TrayWnd","") Then WinActivate("classname=Shell_TrayWnd","") WinWaitActive("classname=Shell_TrayWnd","") MouseMove(1102,10) MouseDown("right") MouseMove(1102,9) MouseUp("right") WinWait("BRNCLIENTTRAY_{A4F0D159-1B3C-4a1e-BA63-D84663BB4849}","") If Not WinActive("BRNCLIENTTRAY_{A4F0D159-1B3C-4a1e-BA63-D84663BB4849}","") Then WinActivate("BRNCLIENTTRAY_{A4F0D159-1B3C-4a1e-BA63-D84663BB4849}","") WinWaitActive("BRNCLIENTTRAY_{A4F0D159-1B3C-4a1e-BA63-D84663BB4849}","") MouseMove(923,639) MouseDown("left") MouseUp("left") #endregion --- ScriptWriter generated code End --- ; end of connect code $doing_syst_tray = 1 $systray_string = _SysTrayIconTooltip(_SysTrayIconIndex("BRNClientTrayApp.exe")) = _SysTrayIconTooltip(_SysTrayIconIndex("BRNClientTrayApp.exe")) $new_systray_string = $systray_string $doing_syst_tray = 1 $count = 1 ConsoleWrite($count & ": "& $systray_string & @CR) While ($doing_syst_tray = 1 ) $systray_string = _SysTrayIconTooltip(_SysTrayIconIndex("BRNClientTrayApp.exe")) $not_same = StringCompare ($systray_string, $new_systray_string ) If ($not_same <> 0 ) Then $new_systray_string = $systray_string ConsoleWrite($count & ":"& $systray_string& ":"&@CR) FileWriteLine( $vfile, $count & ": "& $systray_string& @CRLF) EndIf $connected = StringInStr($new_systray_string, "Blue Ridge Networks VPN Connected") If ($connected <> 0) Then $doing_syst_tray = 0 $count = $count + 1 If ($count > 200 ) Then ;Msgbox ( 0,"Error", "Blue Ridge Networks VPN Connected not found " & $connect_disconnect_count) Exit Endif Sleep(100) check_key() Wend $ping_ok = Ping ("www.yahoo.com") ;msgbox(0,"connected","connected, count, ping_ok, loop "& $count & "," & $ping_ok & ","& $connect_disconnect_count, 1) FileWriteLine( $vfile, "connected, count, ping_ok, loop "& $count & "," & $ping_ok & ","& $connect_disconnect_count) $connect_disconnect_count = $connect_disconnect_count + 1 ConsoleWrite("Loop Count: "& $connect_disconnect_count& @CR) Wend Exit Func check_key() $dll = DllOpen("user32.dll") If _IsPressed("10", $dll) Then MsgBox(0,"_IsPressed", "Shift Key Pressed") Exit EndIf DllClose($dll) EndFunc ;-----------------------------Systray_UDF---------------------------------- ;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------ ; ---------------------------------------------------------------------------- ; ; 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 ; ---------------------------------------------------------------------------- #NoTrayIcon 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 Const $PROCESS_ALL_ACCESS = 2035711 Const $NO_TITLE = "---No title---" ; text that is used when icon window has no title ;=============================================================================== ; ; 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_ptr", -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 icon's tooltip text ; 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() Else $process = _SysTrayIconTitles() 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_ptr", -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","ptr","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", 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 $ret = DLLCall("user32.dll","int","GetWindowThreadProcessId", "hwnd", _FindTrayToolbarWindow(), "int_ptr", -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","ptr","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", _FindTrayToolbarWindow(), "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", DllStructGetSize ( $TBBUTTON ), "int", 0x8000) EndIf DllCall('kernel32.dll', 'int', 'CloseHandle', 'int', $procHandle[0]) $TBBUTTON = 0 $TBBUTTON2 = 0 $ExtraData = 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 $ret = DLLCall("user32.dll","int","GetWindowThreadProcessId", "hwnd", _FindTrayToolbarWindow(), "int_ptr", -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","ptr","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", _FindTrayToolbarWindow(), "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", DllStructGetSize ( $TBBUTTON ), "int", 0x8000) EndIf DllCall('kernel32.dll', 'int', 'CloseHandle', 'int', $procHandle[0]) $TBBUTTON = 0 $TBBUTTON2 = 0 $ExtraData = 0 $intTip = 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 - TO BE DONE ; ; 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) 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_ptr", -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","ptr","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", 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 Link to comment Share on other sites More sharing options...
tuape Posted January 19, 2008 Share Posted January 19, 2008 (edited) Hi,This might be caused by incorrectly freeing memory in Systray UDF. See this post for more info. I would advice you and anyone else using Systray UDF to get the latest version from here.I'm sorry for the inconvenience. I had completely missed a warning on VirtualFreeEx documentation Edited January 19, 2008 by tuape Link to comment Share on other sites More sharing options...
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