Laden...

Nicht mehr aktive Tray Icons entfernen

Erstellt von Ledge vor 12 Jahren Letzter Beitrag vor 12 Jahren 3.087 Views
L
Ledge Themenstarter:in
17 Beiträge seit 2010
vor 12 Jahren
Nicht mehr aktive Tray Icons entfernen

Hallo zusammen,

auch ich habe nun das Problem das ich mit meiner Anwendung ein Fremdprogram
beende und das Tray Icon im Infobreich leider erst nach einem Mausover entfernt wird.

Habe bei meiner intensiven Suche hier im Forum keine wirkliche Lösung für das Problem gefunden.

Es scheint hier kein direktes Bordmittel in Windows zu geben was es einem ermöglicht den Infobereich so zu reseten das alte Icons erfolgreich aus der Leiste verbannt werden.

Dann habe ich bei meiner Suche (Google) eine interessante Klasse gefunden. Leider ist diese für VB und nicht C#.

Ich hänge die Klasse gleich mal an und vielleicht kann ja mal jemand darüber schauen und mir sagen ob man das für c# anpassen kann und vielleicht kann mir ja auch jemand dabei helfen. Ich bin leider noch relativ neu in C# und das übersetzen bekomme ich sehr wahrscheinlich ohne Hilfe nicht hin.

In VB habe ich es getestet und es klappt wunderbar, selbst dann wenn die Taskleiste automatisch minimiert oder aus 2 bzw. 3 Reihen besteht.

Gruß, Wolle

Hier mal die Klasse




Option Explicit

'Messagekonstante
Private Const WM_MOUSEMOVE = &H200

'Strucktur mit den Fensterabmaßen
Private Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type
Dim hSystray As Long

Private Declare Function GetVersionEx Lib "kernel32.dll" Alias "GetVersionExA" (lpVersionInformation As Any) As Long
Private Type OSVERSIONINFO
    dwOSVersionInfoSize As Long
    dwMajorVersion As Long
    dwMinorVersion As Long
    dwBuildNumber As Long
    dwPlatformId As Long
    szCSDVersion As String * 128 ' Maintenance string for PSS usage
End Type

Private Type OSVERSIONINFOEX
    dwOSVersionInfoSize As Long
    dwMajorVersion As Long
    dwMinorVersion As Long
    dwBuildNumber As Long
    dwPlatformId As Long
    szCSDVersion As String * 128  ' Maintenance string for PSS usage
    wServicePackMajor As Integer
    wServicePackMinor As Integer
    wSuiteMask As Integer
    bProductType As Byte
    bReserved As Byte
End Type

Private Const VER_NT_DOMAIN_CONTROLLER As Long = &H2
Private Const VER_NT_SERVER As Long = &H3
Private Const VER_NT_WORKSTATION As Long = &H1

Private Const VER_SUITE_BACKOFFICE As Long = &H4
Private Const VER_SUITE_BLADE As Long = &H4
Private Const VER_SUITE_COMMUNICATIONS As Long = &H8
Private Const VER_SUITE_DATACENTER As Long = &H80
Private Const VER_SUITE_EMBEDDEDNT As Long = &H40
Private Const VER_SUITE_ENTERPRISE As Long = &H2
Private Const VER_SUITE_SINGLEUSERTS As Long = &H100
Private Const VER_SUITE_SMALLBUSINESS As Long = &H1
Private Const VER_SUITE_SMALLBUSINESS_RESTRICTED As Long = &H20
Private Const VER_SUITE_TERMINAL As Long = &H10
Private Const VER_SUITE_PERSONAL As Long = &H200
Private Const VER_SUITE_SERVERAPPLIANCE As Long = &H400

Private Const VER_PLATFORM_WIN32_NT As Long = 2
Private Const VER_PLATFORM_WIN32_WINDOWS As Long = 1
Private Const VER_PLATFORM_WIN32s As Long = 0

Private Declare Function GetVersion Lib "kernel32.dll" () As Long
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Private Declare Function GetClientRect Lib "user32.dll" (ByVal hWnd As Long, lpRect As RECT) As Long
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long


Private Function Refresh(ByVal hTray As Long) As Boolean
Dim X As Long, rRect As RECT, z As Long

If hTray = 0 Then Exit Function
'Größe des Fensters ermitteln
X = GetClientRect(hTray, rRect)

'Zeilenweise durchgehen
For z = 0 To (rRect.Bottom / 20) - 1
    'zu jerder x Position ein MouseMove senden
    For X = 0 To rRect.Right
        SendMessage hTray, WM_MOUSEMOVE, 0, ByVal ((((z * 20) + 10) * &H10000) Or X)
    Next
Next
Refresh = True

End Function
Private Function FindSysTray() As Long
Dim h1 As Long, h2 As Long, h3 As Long
'Handle vom Tray suchen
h1 = FindWindow("Shell_TrayWnd", vbNullString)
If h1 <> 0 Then
    'Handle vom TrayNotify ermitteln
    h2 = FindWindowEx(h1, 0, "TrayNotifyWnd", vbNullString)
    If (GetBS > 14) Or (GetBS = 5) Then
        If GetBS > 15 Then h2 = FindWindowEx(h2, 0, "SysPager", vbNullString)
        If h2 <> 0 Then
            'Handle von der Toolbar ermitteln
            h3 = FindWindowEx(h2, 0, "ToolbarWindow32", vbNullString)
            FindSysTray = h3
        End If
    Else
        FindSysTray = h2
    End If
End If

End Function
Private Function GetBS() As Long
Dim WinVer As String
Dim udtOS As OSVERSIONINFO

udtOS.dwOSVersionInfoSize = Len(udtOS)

Call GetVersionEx(udtOS)

Debug.Print udtOS.dwBuildNumber
Debug.Print udtOS.dwMajorVersion
Debug.Print udtOS.dwMinorVersion
Debug.Print udtOS.szCSDVersion

Select Case udtOS.dwPlatformId
    Case VER_PLATFORM_WIN32_NT
        If udtOS.dwMajorVersion = 3 Then
            GetBS = 13 'NT 3.51
        ElseIf udtOS.dwMajorVersion = 4 Then
            GetBS = 14 'NT 4.0
        ElseIf udtOS.dwMajorVersion = 5 Then
            If udtOS.dwMinorVersion = 0 Then
                GetBS = 15 'Win2000
            ElseIf udtOS.dwMinorVersion = 1 Then
                GetBS = 16 'WinXP
            ElseIf udtOS.dwMinorVersion = 2 Then
                GetBS = 17 'Win .NET/2003
            End If
        End If
    Case VER_PLATFORM_WIN32_WINDOWS
        If udtOS.dwMinorVersion = 0 Then
            GetBS = 3 'Win 95
        ElseIf udtOS.dwMinorVersion = 10 Then
            GetBS = 4 'Win 98
        ElseIf udtOS.dwMinorVersion = 90 Then
            GetBS = 5 'Win ME
        End If
    Case VER_PLATFORM_WIN32s
        GetBS = 1
End Select

End Function
Public Function SysTrayRefresh() As Boolean

'Fensterhandle vom Systray ermitteln
hSystray = FindSysTray
'Systray refreshen
If Refresh(hSystray) Then SysTrayRefresh = True
End Function
Property Get hWnd() As Long
hWnd = hSystray
End Property
Public Function BSInfo() As String
Dim WinVer As String, lngBS As Long
Dim udtOSEX As OSVERSIONINFOEX, udtOS As OSVERSIONINFO

lngBS = GetBS

udtOS.dwOSVersionInfoSize = Len(udtOS)
udtOSEX.dwOSVersionInfoSize = Len(udtOSEX)

If lngBS > 13 Then
    If GetVersionEx(udtOSEX) Then
        If (udtOSEX.bProductType And VER_NT_WORKSTATION) Then
            If lngBS > 14 Then
                WinVer = " Profesional" & vbCrLf
            Else
                WinVer = " Workstation" & vbCrLf
            End If
        Else
            WinVer = " Server" & vbCrLf
        End If
        If (udtOSEX.wSuiteMask And VER_SUITE_PERSONAL) Then WinVer = "Home Edition"
        WinVer = WinVer & udtOSEX.szCSDVersion
    Else
        Call GetVersionEx(udtOS)
        WinVer = WinVer & udtOS.szCSDVersion
    End If
End If

If lngBS = 1 Then BSInfo = "Win32s"
If lngBS = 3 Then BSInfo = "Win 95"
If lngBS = 4 Then BSInfo = "Win 98"
If lngBS = 5 Then BSInfo = "Win ME"
If lngBS = 13 Then BSInfo = "Win NT 3.51" & WinVer
If lngBS = 14 Then BSInfo = "Win NT 4.0" & WinVer
If lngBS = 15 Then BSInfo = "Win 2000" & WinVer
If lngBS = 16 Then BSInfo = "Win XP" & WinVer
If lngBS = 17 Then BSInfo = "Win 2003/.NET" & WinVer

End Function


6.911 Beiträge seit 2009
vor 12 Jahren

Hallo,

i.d.R. bleibt das TrayIcon stehen wenn es nicht ordentlich Disposed wird. Schau dir an ob das korrekt implementiert ist -> dann sollte es auch automatisch verschwinden.

Siehe Dispose implementieren und verwenden (IDisposable)

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo Ledge,

Habe bei meiner intensiven Suche hier im Forum keine wirkliche Lösung für das Problem gefunden.

siehe z.B. Wie Systray komplett aktualisieren lassen?.

das übersetzen bekomme ich sehr wahrscheinlich ohne Hilfe nicht hin.

Es gibt Tools und Webseiten, die VB-Code automatisch in C#-Code übersetzen. Also kein Grund, uns um Unterstützung zu bitten.

Ich bin leider noch relativ neu in C#

Dann beachte bei Nachfragen bitte vorsorglich [Hinweis] Wie poste ich richtig? Punkt 1.1.1.

herbivore

L
Ledge Themenstarter:in
17 Beiträge seit 2010
vor 12 Jahren

i.d.R. bleibt das TrayIcon stehen wenn es nicht ordentlich Disposed wird. Schau dir an ob das korrekt implementiert ist -> dann sollte es auch automatisch verschwinden.

Hallo Du,

kann man dass den für Fremde Anwendungen überhaupt anwenden?

Gruß, Wolle

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo,

wenn die Fremdanwendung nicht korrekt implementiert ist (Dispose ist nicht korrekt oder für native Anwendung das entsprechende Äquivalent) und du den Code von dieser nicht ändern kannst nicht.

Dann zählt das was herbivore geschrieben hat.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

L
Ledge Themenstarter:in
17 Beiträge seit 2010
vor 12 Jahren

OK, dachte ich mir schon, habe aber in meinen Tread extra reingeschrieben, dass es sich um eine Fremdanwendung handelt.

Danke Dir.

L
Ledge Themenstarter:in
17 Beiträge seit 2010
vor 12 Jahren

siehe z.B.
>
.

Hab das Beispiel auch gefunden, aber leider funktioniert es nicht richtig.

Es gibt Tools und Webseiten, die VB-Code automatisch in C#-Code übersetzen.

Das es solche Tools gibt, wusste ich nicht, danke für den Tip. Alledings habe ich mitlerweile einige dieser Tools an dieser Klasse probiert und leider konnte mir keines den Code wirklich umwandeln. Wenn Du eins kennst was dazu in der Lage ist und am am besten nix kostet, währe ich Dir dankbar für einen Tip in die richtige Richtung

Danke Dir, Gruß, Wolle

1.346 Beiträge seit 2008
vor 12 Jahren

Du kannst ja mal versuchen nach dem beenden den tray bereich Aktualisieren zu lassen.

http://safari-tech.serveblog.net/?p=101

Ob das funktioniert weiß ich aber nicht

771 Beiträge seit 2009
vor 12 Jahren

Hi Wolle (Ledge),

unter http://www.vbto.net/ gibt es eine Evaluation-Version für einen VB->.NET Converter (auch wenn man evtl. noch ein paar Zeilen von Hand nachkorrigieren muss).

Und falls du VS mit VB.NET installiert hast, so müßte der einen Wizard drin haben, der automatisch den Code von VB nach VB.NET übersetzt, s. What's New with the Visual Basic Upgrade Wizard in Visual Basic 2005