Consolen Application icon anzeigen.

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Consolen Application icon anzeigen.

    Hallo,

    Ich habe folgendes Problem und werde langsam Wahnsinnig.

    Ich habe ein Schnittstellenprogramm geschrieben, welches bei einem Kunden eingesetzt wurde.
    Nun wollte ich zur erleichterung für die Admins ein Icon setzen damit man schnell das Programm in der Taskleiste ausfindig machen kann (da mehrere instanzen laufen).

    Das Icon habe ich unter den Einstellungen der Projektmappe gesetzt, Kompiliert und veröffentlicht.
    Das Icon wird angezeigt, wenn ich die .exe manuell klicke/starte.

    Nun zu dem Problem.

    Das Programm wird mittels externen tool jeden Tag in der Früh gestartet über folgenden Code (nicht Original code):

    VB.NET-Quellcode

    1. Private Sub StarteExe(pfad as String)
    2. Dim p As New Process()
    3. Try
    4. p.StartInfo = New ProcessStartInfo(pfad) With {
    5. .UseShellExecute = True,
    6. .ErrorDialog = True,
    7. .WindowStyle = ProcessWindowStyle.Minimized
    8. }
    9. p.Start()
    10. Catch ex As Exception
    11. wrlog(ex.message & ex.stackstrace)
    12. End Try
    13. End Sub



    Das Programm wird gestartet, jedoch wird das Icon das ich setzte nicht angezeigt, sondern das Standartsymbol.

    Wie ist es möglich das auch über das Starten eines externen Tools das Icon angezeigt wird?


    Hoffe Ihr könnt mir da helfen.

    Mit freundlichen Grüßen

    Manuel

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Manuapps24“ ()

    Hallo Manuapps, ich habe mich mit einer TrayApp auseinandergesetzt, hier mal mein Beispiel code:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class AppContext
    3. Inherits ApplicationContext
    4. #Region " Storage "
    5. Private WithEvents Tray As NotifyIcon
    6. Private WithEvents MainMenu As ContextMenuStrip
    7. Private WithEvents MnuTicketErstellen As ToolStripMenuItem
    8. Private WithEvents MnuSep1 As ToolStripSeparator
    9. Private WithEvents MnuSep2 As ToolStripSeparator
    10. Private WithEvents MnuTicketWebseite As ToolStripMenuItem
    11. Private WithEvents MnuReadmeFirst As ToolStripMenuItem
    12. #End Region
    13. #Region " Constructor "
    14. Public Sub New()
    15. '*** Menü Initielisieren ***
    16. MnuTicketErstellen = New ToolStripMenuItem("MenüEintrag 2")
    17. MnuSep1 = New ToolStripSeparator()
    18. MnuTicketWebseite = New ToolStripMenuItem("Menüeintrag 2")
    19. MnuSep2 = New ToolStripSeparator()
    20. mnuReadmeFirst = New ToolStripMenuItem("Readme first!")
    21. MainMenu = New ContextMenuStrip
    22. MainMenu.Items.AddRange(New ToolStripItem() {mnuTicketErstellen, mnuSep1, mnuTicketWebseite, mnuSep2, mnuReadmeFirst})
    23. ''*** Tray Initialisieren *
    24. '*** TrayApp anzeigen ***
    25. Tray = New NotifyIcon With {
    26. .Icon = DEINICON,
    27. .ContextMenuStrip = MainMenu,
    28. .Text = "Titel-Text",
    29. .Visible = True
    30. }
    31. End Sub
    32. #End Region
    33. #Region " Event handlers "
    34. '*** Ticket erstellen ***
    35. Private Sub MnuTicketErstellen_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles MnuTicketErstellen.Click
    36. ShowDialog()
    37. End Sub
    38. '**** Ticket webseite Besuchen ***
    39. Private Sub MnuTicketWebseite_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles MnuTicketWebseite.Click
    40. PopupForm.Hide()
    41. Process.Start("http://Webseite-öffnen.de")
    42. End Sub
    43. '*** Doppelklick auf das TrayMenue ***
    44. Private Sub Tray_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Tray.DoubleClick
    45. ShowDialog()
    46. End Sub
    47. Private Sub MnuReadmeFirst_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles MnuReadmeFirst.Click
    48. PopupForm.Hide()
    49. '*** Anleitung öffnen ***
    50. AboutBox1.Show()
    51. End Sub
    52. #End Region
    53. End Class


    und mit einer Launchapp das TrayIcon Instanzieren

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Strict On
    2. ''** Nur eine dieser Main Methoden verwenden
    3. Public Module LaunchApp
    4. Public Sub Main()
    5. '** VIsualStyles anschalten
    6. Application.EnableVisualStyles()
    7. '** Startet die Application
    8. Application.Run(New AppContext)
    9. End Sub
    10. End Module

    @Manuapps24 Willkommen im Forum. :thumbup:
    Um was für eine Applikation handelt es sich?
    Mögliche Antworten:
    • Console,
    • WinForm,
    • WPF.
    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!
    @Manuapps24 Willkommen im Forum. :thumbup:
    Es ist genau so wie Du beschreibst.
    Solo gestartet kommt das eigene Icon, "fremd" gestartet kommt das Standard-Icon.
    Selbst wenn Du das Programm aus der Entwicklungsumgebung heraus startest, kommt das Standard-Icon.
    Wenn Du das Programm aus einer Batch-Datei startest, kommt das Console-Icon.
    Das ist halt wohl so.
    Tipp: Mach eine WinForm-Anwendung, da klappt das alles wunderbar.
    =====
    @petaod Jou.
    @Blackn0va hat mich da etwas verwirrt.
    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!

    C#-Quellcode

    1. class Program {
    2. [DllImport("kernel32.dll")]
    3. static extern IntPtr GetConsoleWindow();
    4. [DllImport("user32.dll", SetLastError = true)]
    5. public static extern IntPtr SendMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);
    6. [DllImport("shell32.dll")]
    7. static extern IntPtr ExtractAssociatedIcon(IntPtr hInst, StringBuilder lpIconPath, ref int lpiIcon);
    8. static void Main(string[] args) {
    9. int index = 0;
    10. IntPtr handle = GetConsoleWindow();
    11. IntPtr icon = ExtractAssociatedIcon(IntPtr.Zero, new StringBuilder(System.Reflection.Assembly.GetExecutingAssembly().Location), ref index);
    12. SendMessage(handle, 0x0080, new IntPtr(0x00), icon);
    13. SendMessage(handle, 0x0080, new IntPtr(0x01), icon);
    14. Console.ReadKey();
    15. }
    16. }


    OnlineConverter:

    VB.NET-Quellcode

    1. <DllImport("kernel32.dll")>
    2. Private Shared Function GetConsoleWindow() As IntPtr
    3. End Function
    4. <DllImport("user32.dll", SetLastError:=True)>
    5. Public Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal msg As UInteger, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
    6. End Function
    7. <DllImport("shell32.dll")>
    8. Private Shared Function ExtractAssociatedIcon(ByVal hInst As IntPtr, ByVal lpIconPath As StringBuilder, ByRef lpiIcon As Integer) As IntPtr
    9. End Function
    10. Private Shared Sub Main(ByVal args As String())
    11. Dim index As Integer = 0
    12. Dim handle As IntPtr = GetConsoleWindow()
    13. Dim icon As IntPtr = ExtractAssociatedIcon(IntPtr.Zero, New StringBuilder(System.Reflection.Assembly.GetExecutingAssembly().Location), index)
    14. SendMessage(handle, 128, New IntPtr(0), icon)
    15. SendMessage(handle, 128, New IntPtr(1), icon)
    16. Console.ReadKey()
    17. End Sub

    @Bluespide OK.
    Dein Code funktioniert beim Start aus der Entwicklungsumgebung,
    aber er funktioniert nicht beim Start aus einer Batch-Datei heraus.
    @Manuapps24 Wie startest Du Dein Programm?
    Teste mal den Code von Bluespide.
    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!