![]() |
Windows 11 Standarddrucker ändern
Guten Morgen,
hat jemand unter Windows 11 aus Delphi heraus den Standarddrucker ändern können? Bis Windows 10 habe ich das so gemacht:
Delphi-Quellcode:
Windows 11 reagiert auf den Code nicht.
procedure TForm1.SetDefaultPrinter(NewDefPrinter: string);
var ResStr: array [0 .. 255] of char; begin StrPCopy(ResStr, NewDefPrinter); WriteProfileString('windows', 'device', ResStr); StrCopy(ResStr, 'windows'); SendNotifyMessage(HWND_BROADCAST, WM_WININICHANGE, 0, LongInt(@ResStr)); end; Die 2 folgende Variante welche man häufig im Internet findet, bringt bei mir unter Windows 10 & 11 den Fehler 'Systemfehler. Code: 1801. Der Druckername ist unzulässig'
Delphi-Quellcode:
Hat jemand einen Tipp für mich?
procedure SetWinDefaultPrinter(const Name: String);
var fnSetDefaultPrinter: function(pszPrinter: PChar): Bool; stdcall; H: THandle; Size, Dummy: Cardinal; PrinterInfo: PPrinterInfo2; begin if (Win32Platform = VER_PLATFORM_WIN32_NT) and (Win32MajorVersion >= 5) then begin @fnSetDefaultPrinter := GetProcAddress(GetModuleHandle(winspl), 'SetDefaultPrinterA'); if (@fnSetDefaultPrinter = NIL) then RaiseLastOSError; if NOT fnSetDefaultPrinter(PChar(Name)) then RaiseLastOSError; end else begin if NOT OpenPrinter(PChar(Name), H, NIL) then RaiseLastOSError; try GetPrinter(H, 2, NIL, 0, @Size); if GetLastError <> ERROR_INSUFFICIENT_BUFFER then RaiseLastOSError; GetMem(PrinterInfo, Size); try if NOT GetPrinter(H, 2, PrinterInfo, Size, @Dummy) then RaiseLastOSError; PrinterInfo^.Attributes := PrinterInfo^.Attributes or PRINTER_ATTRIBUTE_DEFAULT; if NOT Winspool.SetPrinter(H, 2, PrinterInfo, PRINTER_CONTROL_SET_STATUS) then RaiseLastOSError; finally FreeMem(PrinterInfo); end; finally ClosePrinter(H); end; end; |
AW: Windows 11 Standarddrucker ändern
Für den Fall, dass es sich um Netzwerkdrucker handelt, rate ich mal (ohne es zu wissen):
Es gibt unter Windows ab 10 mehrere Namen für Netzwerkdrucker. In Legacy-Anwendungen heißen sie anders als Microsoft-Anwendungen. Alte Methoden verwendeten immer die Legacy-Benennung \\Servername\Druckername. Vielleicht ist es jetzt Druckername an Servername, wie es in Windows oder Office ist. |
AW: Windows 11 Standarddrucker ändern
Zitat:
Zeugs in der Win.ini , obwohl Vieles seit Jahrzehnten in der Registry liegt. Irgendwann wird sich der Hersteller sagen: Jetzt habe ich jahrzehnte lange altes Zeugs noch ausgewertet ... langsam ist Schluß, weg damit ... wer das immernoch nutzt, ist selber Schuld. ![]() Und auch hier sagt dir die Hilfe etwas. Zitat:
2000 is tot XP ist tot Vista ist tot 7 ist tot 8 ist tot die ersten drei oder vier Unterversionen der 10 sind bereits ausgestorben (Support ausgelaufen) Wer kommt da jetzt auf die Idee LagacyCode einzubauen, für den Fall, dass es diese Funktion noch nicht geben sollte? Aber daß und warum dein Code nicht funktioniert, ist sowas von klar. SetDefaultPrinterA und PChar .... ähhhhh, also seit Delphi 2009 PChar=PWideChar und String=WideString UnicodeSting |
AW: Windows 11 Standarddrucker ändern
![]() Zitat:
Zitat:
|
AW: Windows 11 Standarddrucker ändern
Zitat:
|
AW: Windows 11 Standarddrucker ändern
D2009 :angle:
aber ist schon soooooooo lange her ... aus heutiger Sicht fast das Gleiche |
AW: Windows 11 Standarddrucker ändern
okay, ich schaue mir mal SetDefaultPrinterW an. Danke.
|
AW: Windows 11 Standarddrucker ändern
PS:
Delphi-Quellcode:
XE noch nicht, aber in 10.x isses schon drin
unit Winapi.WinSpool;
... function SetDefaultPrinter; external winspl name 'SetDefaultPrinterW' delayed; function SetDefaultPrinterA; external winspl name 'SetDefaultPrinterA' delayed; function SetDefaultPrinterW; external winspl name 'SetDefaultPrinterW' delayed; |
AW: Windows 11 Standarddrucker ändern
:thumb:Funktioniert, danke.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:32 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz