获取默认打印机名:

function TForm1.GetDefaultPrinterName: string;var  iSize: Integer;  sIniFile, sSection, sKeyName: PChar;begin  iSize := 256;  sIniFile := 'win.ini';  sSection := 'windows';  sKeyName := 'device';  SetLength(Result, iSize);  GetPrivateProfileString(sSection, sKeyName, nil, PChar(Result), iSize, sIniFile);  Result := Copy(Result, 0, Pos(',', Result) - 1);end;

更改默认打印机:需要Uses WinSpool

procedure ChangeDefaultPrinter(const Name: string);var  W2KSDP: function(pszPrinter: PChar): Boolean; stdcall;  H: THandle;  Size, Dummy: Cardinal;  PI: PPrinterInfo2;begin  if (Win32Platform = VER_PLATFORM_WIN32_NT) and (Win32MajorVersion >= 5) then  begin    @W2KSDP := GetProcAddress(GetModuleHandle(winspl), 'SetDefaultPrinterA');    if @W2KSDP = nil then RaiseLastOSError;    if not W2KSDP(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(PI, Size);      try        if not GetPrinter(H, 2, PI, Size, @Dummy) then RaiseLastOSError;        PI^.Attributes := PI^.Attributes or PRINTER_ATTRIBUTE_DEFAULT;        if not SetPrinter(H, 2, PI, PRINTER_CONTROL_SET_STATUS) then RaiseLastOSError;      finally        FreeMem(PI);      end;    finally      ClosePrinter(H);    end;  end;end; //ChangeDefaultPrinter
ChangeDefaultPrinter函数 在D7下使用SetDefaultPrinterA,在Delphi2010以上版本使用SetDefaultPrinterW
procedure TDM.ChangeDefaultPrinter(const Name: string);var  Device: array[0..255] of Char;  Driver: array[0..255] of char;  Port: array[0..255] of char;  s : array[0..255] of Char;  hDeviceMode: THandle;  I: Integer;begin  for I := 0 to Printer.Printers.Count - 1 do    if Printer.Printers.Strings[I] = name then    begin      Printer.PrinterIndex := I;      Break;    end;  Printer.GetPrinter (Device, Driver, Port, hDeviceMode);  StrCopy (s, Device);  StrCat (s, ',');  StrCat (s, Driver);  StrCat (s, ',');  StrCat (s, Port);  WriteProfileString ('windows', 'device', s);  StrCopy (s, 'windows');  SendMessage (HWND_BROADCAST, WM_WININICHANGE, 0, LongInt(@s));end;//这个函数也可以更改打印机,效果没有上面的好