TrayIcon von einem externen Programm entfernen

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von sdcleitung.

    TrayIcon von einem externen Programm entfernen

    Hallo,
    ich müsste dringend den TrayIcon eines externen Programms entfernen.

    Es geht darum, dass die Benutzer das Antiviren System nicht deaktivieren können sollen und ich deshalb den Tray Icon löschen möchte.
    Leider habe ich hier im Forum und auch im Internet nichts gefunden :( Ich dachte an Shell_NotifyIcon, jedoch verstehe ich nicht ganz wo ich die ProzessID o.ä. angeben könnte.

    Schonmal vielen vielen Dank für eure Hilfe ;)

    sdcleitung schrieb:

    Es geht darum, dass die Benutzer das Antiviren System nicht deaktivieren können sollen und ich deshalb den Tray Icon löschen möchte.

    Die Benutzer sind Rentner mit Alzheimer und keinerlei Computererfahrung? Denn nur bei denen würde so ein "Schutz" Sinn machen. Die "korrekte" Lösung ist üblicherweise, dass der Benutzer KEINE Adminrechte hat und der Admin das System über die Group Policies absichert.
    Danke für den Link ;)
    Habe vorhin schon etwas gefunden:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices
    2. Module Module1
    3. Private Structure NOTIFYICONDATA
    4. Public cbSize As Long
    5. Public hWnd As Long
    6. Public uId As Long
    7. Public uFlags As Long
    8. Public uCallBackMessage As Long
    9. Public hIcon As Long
    10. <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=128)> _
    11. Public szTip As String
    12. End Structure
    13. ' The messages to send to the function
    14. Private Declare Function Shell_NotifyIcon Lib "shell32.dll" _
    15. Alias "Shell_NotifyIconA" ( _
    16. ByVal dwMessage As Long, _
    17. ByVal pnid As NOTIFYICONDATA) As Long
    18. ' NOTIFYICONDATA uFlags Konstanten
    19. Private Const NIF_ICON = &H2
    20. Private Const NIF_MESSAGE = &H1
    21. Private Const NIF_TIP = &H4
    22. Private Const NIF_STATE = &H8 ' Windows 2000
    23. Private Const NIF_INFO = &H10 ' Windows 2000
    24. ' NOTIFYICONDATA Win2000 dwState Konstanten
    25. Private Const NIS_HIDDEN = &H1
    26. Private Const NIS_SHAREDICON = &H2
    27. ' NOTIFYICONDATA Win2000 uTimeoutOrVersion Konstanten
    28. Private Const NOTIFYICON_VERSION = &H1
    29. ' NOTIFYICONDATA Win2000 dwInfoFlags Konstanten
    30. Private Const NIIF_WARNING = &H30
    31. Private Const NIIF_ERROR = &H10
    32. Private Const NIIF_INFO = &H40
    33. ' Shell_NotifyIcon dwMessage Konstanten
    34. Private Const NIM_ADD = &H0
    35. Private Const NIM_DELETE = &H2
    36. Private Const NIM_MODIFY = &H1
    37. Private Const NIM_SETFOCUS = &H4 ' Windows 2000
    38. Private Const NIM_SETVERSION = &H8 ' Windows 2000
    39. ' Einige Fensternachrichten
    40. Private Const WM_LBUTTONDBLCLK = &H203
    41. Private Const WM_LBUTTONDOWN = &H201
    42. Private Const WM_LBUTTONUP = &H202
    43. Private Const WM_MBUTTONDBLCLK = &H209
    44. Private Const WM_MBUTTONDOWN = &H207
    45. Private Const WM_MBUTTONUP = &H208
    46. Private Const WM_RBUTTONDBLCLK = &H206
    47. Private Const WM_RBUTTONDOWN = &H204
    48. Private Const WM_RBUTTONUP = &H205
    49. Private Const WM_MOUSEMOVE = &H200
    50. Dim TrayIcon As NOTIFYICONDATA
    51. Public Sub Main(ByVal hWnd, ByVal mIcon)
    52. With TrayIcon
    53. .cbSize = Len(TrayIcon)
    54. .hIcon = mIcon
    55. .hWnd = hWnd
    56. .szTip = "Mein erstes Trayicon" & vbNullChar
    57. .uCallBackMessage = WM_MOUSEMOVE ' Form bekommt die Ereignisse
    58. .uFlags = NIF_ICON Or NIF_MESSAGE Or NIF_TIP
    59. .uId = 0&
    60. End With
    61. Shell_NotifyIcon(NIM_DELETE, TrayIcon)
    62. End Sub
    63. End Module


    Allerdings habe ich eben wie gesagt das Problem, dass ich nicht verstehe wie ich das ganze auf einen bestimmten Prozess (z.b. durch MainWindowHandle, Prozess ID o.ä. identifizierbar) anwenden kann.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „sdcleitung“ ()

    Danke schonmal ;)

    Leider blicke ich es wohl noch nicht so ganz.
    Müsste die hwnid nicht immer die selbe sein solange das Programm läuft?

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Declare Function FindWindow Lib "user32" _
    2. Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName _
    3. As String) As Long
    4. Const SWP_HIDEWINDOW = &H80
    5. Const SWP_SHOWWINDOW = &H40
    6. Dim hwnd1 As Long
    7. hwnd1 = FindWindow("", [PROCESSNAME])


    Da wird mir nämlich nach jedem ausführen der Funktion um hwnd zu bekommen eine andere Zahlenreihenfolge ausgegeben

    sdcleitung schrieb:

    ich blicke da überhaupt nicht durch

    Nimm Dir den Beitrag von @picoflop zu Herzen und lasss es sein.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    OK, also solangsam blicke ich durch ...

    Allerdings geht das ganze noch nicht so wirklich:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Shared Function sendmsg(ByVal value As IntPtr, ByVal msg As UInteger)
    2. Try
    3. Return SendMessage(value, msg, vbNullString, vbNullString)
    4. Catch ex As Exception
    5. Return vbNull
    6. End Try
    7. End Function
    8. --Aufgerufen durch (nWnd ist als IntPtr definiert und beinhaltet das vom FindWindow zurückgegebene Handle, TB_GETBUTTON habe ich als &H400 + 23 definiert):
    9. Dim iconhwnd as TBBUTTON = Func.sendmsg(nWnd, TB_GETBUTTON)


    Es kommt "Die angegebene Umwandlung ist ungültig.". Dies ist ja auch kein Wunder, da ich SendMessage As IntPtr definiert habe, iconhwnd aber als TBBUTTON.
    Ich kann SendMessage ja aber nicht als TBBUTTON definieren, das geht auch nicht. Deshalb stehe ich hier jetzt etwas auf dem Schlauch (bei pinvoke ist sendmessage als intptr angegeben nach dem gulliboard link sollte aber eine TBBUTTON Struktur zurückgegeben werden?)

    Könntet ihr mir da vielleicht noch einmal helfen?

    Schonmal vielen Dank und frohe Weihnachten ;)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „sdcleitung“ ()

    Ich habe jetzt mal zum testen dieses Program genommen:
    jo0ls-dotnet-stuff.blogspot.co…numerate-system-tray.html

    Damit bekomme ich die NotifyIconData Struktur. Jetzt habe ich die Shell_NotifyIcon Function eingefügt:

    VB.NET-Quellcode

    1. <DllImport("shell32.dll")> _
    2. Shared Function Shell_NotifyIcon(ByVal dwMessage As UInteger, ByRef pnid As NotifyIconData) As Boolean
    3. End Function


    und mit Shell_NotifyIcon(&H2, nid) die Funktion aufgerufen (&H2 ist der Löschbefehl und nid ist die Icon Struktur)

    Der Icon bleibt trotzdem im Tray Bereich ?