Wartezeit bei Standarddrucker ändern

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von Toorms.

    Wartezeit bei Standarddrucker ändern

    Guten Morgen liebe Community,

    ich habe ein kleines - nennen wir es mal Strinrunzeln:
    • Ich bin gerade dabei, dass man sich mit simpler GUI und Combobox den Standard-Drucker ändern lassen kann. Soweit so gut ...
    ... wenn ich die Applikation starte, liest er den aktuellen Standarddrucker ein und ich kann aus der Combobox meinen neuen wählen und per Click auf Button bestätigen.

    Was ich nun aber beobachte, ist folgendes:
    • Der Standarddrucker ist nicht direkt geändert sondern es brauch ein paar Minuten, bis andere Apps (meine eigene und auch notepad.exe zB) ihn auch als Standarddrucker erkennen
    • In der Windows Druckerübersicht ist nirgends ein grüner Haken hinter den Druckern (bei keinem, wie man es normalerweise vermuten mag bei Default Printers)

    Gibt es da einen Weg, dass der Standarddrucker direkt erkannt wird (Dienst neu starten, oder ähnliches) und kann sich einer erklären, wieso der grüne Haken bei den Druckern nicht ist (wobei das noch das geringste Problem ist).

    Besten Dank
    Toorms

    Codegulasch vom Form (in Testing, auch noch kein Errorhandling drin, etc.):
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Drawing.Printing
    2. Public Class frmMain
    3. Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    4. Dim strInstalledPrinters As String
    5. Dim prntDoc As New PrintDocument
    6. 'check if there is installed printer
    7. If PrinterSettings.InstalledPrinters.Count = 0 Then
    8. MsgBox("No printer installed")
    9. Exit Sub
    10. End If
    11. 'display installed printer into combobox list item
    12. For Each strInstalledPrinters In PrinterSettings.InstalledPrinters
    13. ComboBox1.Items.Add(strInstalledPrinters)
    14. Next strInstalledPrinters
    15. 'Display current default printer on combobox texts
    16. ComboBox1.Text = prntDoc.PrinterSettings.PrinterName
    17. Button1.Text = "Set Default Printer"
    18. End Sub
    19. 'Function to set a printer as default
    20. Function SetDefaulPrinter(ByVal strPrinterName As String) As Boolean
    21. Dim strCurrPrinter As String
    22. Dim WsNetwork As Object
    23. Dim prntDoc As New PrintDocument
    24. strCurrPrinter = prntDoc.PrinterSettings.PrinterName
    25. WsNetwork = CreateObject("WScript.Network")
    26. Try
    27. WsNetwork.SetDefaultPrinter(strPrinterName)
    28. prntDoc.PrinterSettings.PrinterName = strPrinterName
    29. 'set default if selected printer name is a valid installed printer
    30. If prntDoc.PrinterSettings.IsValid Then
    31. Return True
    32. Else
    33. WsNetwork.SetDefaultPrinter(strCurrPrinter)
    34. Return False
    35. End If
    36. Catch ex As Exception
    37. WsNetwork.SetDefaultPrinter(strCurrPrinter)
    38. Return False
    39. Finally
    40. WsNetwork = Nothing
    41. prntDoc = Nothing
    42. End Try
    43. End Function
    44. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    45. If SetDefaulPrinter(ComboBox1.Text) = True Then
    46. MsgBox("Default printer changed to " & ComboBox1.Text)
    47. Else
    48. MsgBox("Printer " & ComboBox1.Text & " is not valid! Please try again or check your configuration.")
    49. End If
    50. End Sub
    51. End Class

    Toorms schrieb:

    VB.NET-Quellcode

    1. Dim prntDoc As New PrintDocument
    Es kann nur eines geben.
    Pack das aus den Prozeduren in die Klasse und weise es jedem Dialog zu bzw. lies dessen Settings aus.
    Damit wären auch die PrinterSettings nur einmal und identisch für alle Prozeduren vorhanden.
    Mit welchem Betriebssystem arbeitest Du?
    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!
    Vollzitat des direkten Vorposts an dieser Stelle entfernt ~VaporiZed

    Stimmt, mache ich nachher mal. Danke. Übersehen.

    RodFromGermany schrieb:

    Mit welchem Betriebssystem arbeitest Du?

    Entwicklung Windows 11, VS22 und laufen wird die Applikation auf Windows 10

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

    @Toorms Wie ist WsNetwork deklariert?
    =====
    Schau mal hier rein:
    pinvoke.net/default.aspx/winspool.setdefaultprinter
    => SendMessageTimeout()
    ====
    Mit der API-Funktion funktioniert das bei mir sofort (Win10, VS19).
    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!

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

    Toorms schrieb:

    Welche API Funktion meinst du gerade?
    Dein Code und
    pinvoke.net/default.aspx/winspool.setdefaultprinter
    und ohne WsNetwork.
    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!

    Toorms schrieb:

    Magst du dein Beispiel mal einmal zeigen,
    Exakt

    RodFromGermany schrieb:

    Dein Code und
    die API-Funktion aus dem PInvoke-Link.
    Ohne Deine WsNetwork-Variable.
    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!
    @Toorms

    VB.NET-Quellcode

    1. Declare Function SetDefaultPrinter Lib "winspool.drv" Alias "SetDefaultPrinterA" (ByVal pszPrinter As String) As Boolean
    und feddich.
    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!

    RodFromGermany schrieb:

    und feddich.


    Ach so, ja, nur frage ich mich, wo in der API SendMessageTimeout deklariert ist.

    VB.NET-Quellcode

    1. HWND_BROADCAST = New IntPtr(0xffff)
    2. pinvokeResult = SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, IntPtr.Zero, IntPtr.Zero, SendMessageTimeoutFlags.SMTO_NORMAL, 1000, innerPinvokeResult)


    Hast du gerade mal ne Idee wie

    Quellcode

    1. HWND_BROADCAST = New IntPtr(0xffff)
    korrekt deklariert wird in vb.net? Das habe ich auch aus der pinvoke.net/default.aspx/winspool/SetDefaultPrinter.html genommen.




    Okay, habe nun für meinen Fall etwas drum herum gearbeitet. Danke aber auf jeden Fall für deinen Hinweis mit der API! Was mich aber noch immer wundert, ist, dass der Grüne Haken in den Windows Drucker Einstellungen nicht mehr sichtbar ist. Der Broadcast zu den Programmen funktioniert sauber, bislang.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. 'If SetDefaulPrinter(ComboBox1.Text) = True Then
    3. ' MsgBox("Default printer changed to " & ComboBox1.Text)
    4. 'Else
    5. ' MsgBox("Printer " & ComboBox1.Text & " is not valid! Please try again or check your configuration.")
    6. 'End If
    7. Try
    8. 'Dim pinvokeResult As IntPtr
    9. Dim HWND_BROADCAST As IntPtr
    10. 'Dim innerPinvokeResult As IntPtr
    11. Dim result As Boolean = SetDefaultPrinter(ComboBox1.Text)
    12. If result Then
    13. HWND_BROADCAST = New IntPtr(65535)
    14. MsgBox("Printer changed")
    15. Else
    16. MsgBox("Printer cannot be chaned")
    17. End If
    18. Catch ex As Exception
    19. MsgBox(ex.ToString)
    20. End Try
    21. ' pinvokeResult = SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, IntPtr.Zero, IntPtr.Zero, SendMessageTimeoutFlags.SMTO_NORMAL, 1000, innerPinvokeResult)
    22. End Sub


    Beiträge zusammengefasst ~VaporiZed

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

    Toorms schrieb:

    dass der Grüne Haken in den Windows Drucker Einstellungen nicht mehr sichtbar ist.
    Den sehe ich bei Win10 auch nicht, allerdings sehe ich ihn z.B. beim Notepad++-Drucken-Dialog:

    SendMessageTimeout habe ich nicht verwendet.
    Wenn, dann
    PInvoke SendMessageTimeout => pinvoke.net/default.aspx/user32.sendmessagetimeout
    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!