首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >更改Windows 11上的默认打印机[delphi] [windows-11] [打印]

更改Windows 11上的默认打印机[delphi] [windows-11] [打印]
EN

Stack Overflow用户
提问于 2022-07-15 09:04:48
回答 2查看 156关注 0票数 0

如何更改Windows 11上的默认打印机?以下代码在Windows 10上运行良好,但在Windows 11上不工作:

代码语言:javascript
运行
复制
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; 

打印机首选项“让Windows管理我的默认打印机”已关闭,一台打印机设置为默认。任何暗示我都很高兴。

EN

回答 2

Stack Overflow用户

发布于 2022-07-15 10:22:17

如我所见,你使用的是“旧式”代码。我认为微软已经打破了"WIN.INI"-file直接从Win9X交付的能力。尝试使用通用的WinApi解决方案。这应该会有帮助:https://learn.microsoft.com/en-us/windows/win32/printdocs/setdefaultprinter

票数 2
EN

Stack Overflow用户

发布于 2022-07-18 06:25:31

谢谢,这段代码适用于我:

代码语言:javascript
运行
复制
procedure TForm1.SetDefaultPrinter(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), 'SetDefaultPrinterW');
     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;
end;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72991606

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档