Systray Programme beenden.

  • Hallo zusammen,

    wenn ein Programm im Systray ist, gibt es ja die Möglichkeit dieses per Rechtsklick zu beenden. Wie kann ich das realisieren.

    Hat da jemand eine Idee??


    LG

    Schnuecks

  • Hi...

    erstmal liest du aus was für Prozesse da sind...obwohl-----

    kuckst du hier: Process Information

    und baust dir das noch so um das das deinem geschmack entspricht...
    es gibt bestimmt ne einfache Lösung (?) einen Prozess per AutoIt zu beenden.
    Gta hats ja schon eingebautin seinem Skript

    Zum schluss machst du noch in dein Programm ein Vermerk das du Teile davon von GtaSpider hast ;)


    Carsten

    Flensburg ist wie Payback - wenn man 18 Punkte hat bekommt man ein Fahrrad.

    Einmal editiert, zuletzt von Waluev (31. Januar 2007 um 22:06)

  • hi,

    mit ProcessExists und ProcessClose und so arbeite ich ja auch. Nur werden die Programme dann einfach rausgeschmissen und nicht normal beendet.

    Habe eben im AutoIt FOrum ein Systray_UDF gefunden und hab auch schon kleine Tests mit gemacht.

    Mal schauen wie es läuft.

    Danke

    Schnuecks

  • Sonst kannst du es auch noch "unelegant" über den Taskmanager lösen.
    Also mit ControlClick, WinGetText und lauter so en spass ;)


    Carsten

    Flensburg ist wie Payback - wenn man 18 Punkte hat bekommt man ein Fahrrad.

    • Offizieller Beitrag

    Hi,

    Spoiler anzeigen
    [autoit]

    #include<Systray.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $title = "XXX"
    ;Global $prcoess = "icqlite.exe"
    Global $prcoess = "winampa.exe"

    [/autoit] [autoit][/autoit] [autoit]

    ;clickSysTrayByTitle($title, "right")
    clickSysTrayByProcess($prcoess, "right")

    [/autoit] [autoit][/autoit] [autoit]

    Func clickSysTrayByTitle($winTitle, $click = "left", $times = 1)
    Local $a = _SysTrayIconTitles ()
    Local $p = MouseGetPos()
    For $i = 0 To UBound($a) - 1
    If $a[$i] = $winTitle Then
    $pos = _SysTrayIconPos ($i)
    MouseClick($click, $pos[0], $pos[1], $times, 1)
    ExitLoop
    EndIf
    Next
    MouseMove($p[0], $p[1], 1)
    EndFunc ;==>clickSysTrayByTitle

    [/autoit] [autoit][/autoit] [autoit]

    Func clickSysTrayByProcess($winProcess, $click = "left", $times = 1)
    Local $a = _SysTrayIconProcesses ()
    Local $p = MouseGetPos()
    For $i = 0 To UBound($a) - 1
    If $a[$i] = $winProcess Then
    $pos = _SysTrayIconPos ($i)
    MouseClick($click, $pos[0], $pos[1], $times, 1)
    ExitLoop
    EndIf
    Next
    MouseMove($p[0], $p[1], 1)
    EndFunc ;==>clickSysTrayByProcess

    [/autoit]

    So long,

    Mega

  • Hallo zusammen,

    ich habe nicht sehr viel Erfahrung mit AutoIt, habe hier aber schon viele gute und hilfreiche Tipps bekommen. Ist echt ein Super Forum.

    Nun aber zu meinem Anliegen:

    Ich möchte ein Programm (UpdaterUI.exe) - welches im Systray ist - via Doppelklick (linke Maustaste) öffnen, um dann weitere Aktionen auszuführen.

    Ich habe schon einiges mit den hier vorhandenen Beispielen getestet, komme aber überhaupt nicht zu einem Ergebnis.

    ?(

    bankrupty

    Einmal editiert, zuletzt von bankrupty (2. Februar 2007 um 12:34)

    • Offizieller Beitrag

    Hi,

    hast du es mal so probiert?

    Spoiler anzeigen
    [autoit]

    #include<Systray.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $prcoess = "UpdaterUI.exe"

    [/autoit] [autoit][/autoit] [autoit]

    clickSysTrayByProcess($prcoess, "left", 2)

    [/autoit] [autoit][/autoit] [autoit]

    Func clickSysTrayByProcess($winProcess, $click = "left", $times = 1)
    Local $a = _SysTrayIconProcesses ()
    Local $p = MouseGetPos()
    For $i = 0 To UBound($a) - 1
    If $a[$i] = $winProcess Then
    $pos = _SysTrayIconPos ($i)
    MouseClick($click, $pos[0], $pos[1], $times, 1)
    ExitLoop
    EndIf
    Next
    MouseMove($p[0], $p[1], 1)
    EndFunc ;==>clickSysTrayByProcess

    [/autoit]

    So long,

    Mega

  • Hallo Mega,

    dann bekomme ich die folgende Fehlermeldung:

    Code
    >"C:\APPL\AutoIt3\SciTE\AutoIt3Wrapper\AutoIt3Wrapper.exe" /run /beta /ErrorStdOut /in "c:\_lwd\usb\autoit\examples\test.au3" /autoit3dir "C:\APPL\AutoIt3\beta" /UserParams    
    +> Starting AutoIt3Wrapper v.1.7.5
    >Running:(3.2.2.0):C:\APPL\AutoIt3\beta\autoit3.exe "c:\_lwd\usb\autoit\examples\test.au3"    
    C:\_lwd\usb\autoit\examples\test.au3 (582) : ==> Variable used without being declared.: 
    $count = DLLCall("user32.dll","int","SendMessage", "hwnd", $hWnd, "int", $TB_BUTTONCOUNT, "int", 0, "int", 0) 
    $count = DLLCall("user32.dll","int","SendMessage", "hwnd", $hWnd, "int", ^ ERROR
    +>AutoIT3.exe ended.rc:0
    >Exit code: 0    Time: 1.216


    getestet unter Windows 2000 Professional & Windows Server 2003

    bankrupty

    Einmal editiert, zuletzt von bankrupty (2. Februar 2007 um 13:23)

    • Offizieller Beitrag

    Hi,

    seltsam, ich nutze diese SysTray.au3

    Spoiler anzeigen
    [autoit]

    ; ----------------------------------------------------------------------------
    ;
    ; 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

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ;
    ; 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
    ;
    ;===============================================================================

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    ; 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 ;==>_SysTrayIconTitles

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ;
    ; 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

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ;
    ; 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

    [/autoit] [autoit][/autoit] [autoit]


    EndFunc ;==>_SysTrayIconPids

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ;
    ; 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 ;==>_SysTrayIconIndex

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ;
    ; 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;

    [/autoit] [autoit][/autoit] [autoit]

    ; }
    ;=========================================================
    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

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Local $pId
    Local $text
    Local $procHandle
    Local $index = $iIndex
    Local $bytesRead
    Local $info
    Local $pos[2]
    Local $hidden = 0
    Local $trayHwnd
    Local $ret

    [/autoit] [autoit][/autoit] [autoit]

    $trayHwnd = _FindTrayToolbarWindow()
    If $trayHwnd = -1 Then
    $TBBUTTON = 0
    $TBBUTTON2 = 0
    $ExtraData = 0
    SetError(1)
    Return -1
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $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

    [/autoit] [autoit][/autoit] [autoit]

    $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)

    [/autoit] [autoit][/autoit] [autoit]

    $info = DllStructGetData($ExtraData, 1, 1)
    If Not BitAND(DllStructGetData($TBBUTTON2, 3), 8) Then ; 8 = TBHIDDEN

    $str = "int;int;int;int"
    $RECT = DllStructCreate($str)

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    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 ;==>_SysTrayIconPos

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ;
    ; 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;

    [/autoit] [autoit][/autoit] [autoit]

    ; }
    ;=========================================================
    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]")

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Local $pId
    Local $text
    Local $procHandle
    Local $index = $iIndex
    Local $bytesRead
    Local $info
    Local $lpData

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    $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))

    [/autoit] [autoit][/autoit] [autoit]

    $info = DllStructGetData($ExtraData, 1)
    DllCall("kernel32.dll", "int", "VirtualFreeEx", "int", $procHandle[0], "ptr", $lpData[0], "int", DllStructGetSize($TBBUTTON), "int", 0x8000)
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    DllCall('kernel32.dll', 'int', 'CloseHandle', 'int', $procHandle[0])
    $TBBUTTON = 0
    $TBBUTTON2 = 0
    $ExtraData = 0
    Return $info
    EndFunc ;==>_SysTrayIconHandle

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ;
    ; 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;

    [/autoit] [autoit][/autoit] [autoit]

    ; }
    ;=========================================================
    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]")

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Local $pId
    Local $text
    Local $procHandle
    Local $index = $iIndex
    Local $bytesRead
    Local $info
    Local $lpData

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    $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))

    [/autoit] [autoit][/autoit] [autoit]

    ; 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

    [/autoit] [autoit][/autoit] [autoit]


    $tipChar = Chr(DllStructGetData($intTip, 1, $i))

    [/autoit] [autoit][/autoit] [autoit]

    If $tipChar = "" Then
    ExitLoop
    EndIf
    ConsoleWrite(@CRLF & $i & " Char: " & $tipChar & @LF)
    $info = $info & $tipChar

    [/autoit] [autoit][/autoit] [autoit]

    $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

    [/autoit] [autoit][/autoit] [autoit]

    DllCall('kernel32.dll', 'int', 'CloseHandle', 'int', $procHandle[0])
    $TBBUTTON = 0
    $TBBUTTON2 = 0
    $ExtraData = 0
    $intTip = 0
    Return $info
    EndFunc ;==>_SysTrayIconTooltip

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ;
    ; 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 ;==>_SysTrayIconCount

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ;
    ; 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)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Local $pId
    Local $text
    Local $procHandle
    Local $bytesRead
    Local $info
    Local $lpData

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    $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)

    [/autoit] [autoit][/autoit] [autoit]

    DllCall('kernel32.dll', 'int', 'CloseHandle', 'int', $procHandle[0])

    EndIf

    [/autoit] [autoit][/autoit] [autoit]


    $TBBUTTON = 0
    $TBBUTTON2 = 0

    Return $return[0]
    EndFunc ;==>_SysTrayIconVisible

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ;
    ; 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 ;==>_SysTrayIconMove

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ;
    ; 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 ;==>_SysTrayIconRemove

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ;
    ; 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)

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    Return $hWnd[0]

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>_FindTrayToolbarWindow

    [/autoit]

    So long,

    Mega

  • Hallo,

    Nachdem ich deine Systray.au3 verwende funktioniert das Ganze.
    Meine war etwas kleiner!

    Danke

    bankrupty