【发布时间】:2011-10-14 14:44:48
【问题描述】:
我试图在列出打印机索引的组合框的 on change 事件中更改默认打印机。我使用“打印机”来获取打印机索引,但实际打印是使用专有的打印代码完成的,该代码允许直接打印到 pdf 并简化页面布局。我正在尝试使用以下代码更改默认打印机,然后我的打印代码将打印到该打印机。然而,当这行代码执行时,程序变得无响应且没有任何错误或程序没有响应消息:
SendMessage( HWND_BROADCAST, WM_WININICHANGE, 0,LongInt(cs1));
这是完整的功能。
function TMainFrm.SetDefaultPrinter(const PrinterName: string): boolean;
// Printername is bv: '\\MYPRINTER\HP5-k'
var
s2 : string;
dum1 : Pchar;
xx, qq : integer;
const
cs1 : pchar = 'Windows';
cs2 : pchar = 'Device';
cs3 : pchar = 'Devices';
cs4 : pchar = #0;
begin
xx := 254;
GetMem( dum1, xx);
Result := False;
try
qq := GetProfileString( cs3, pchar( PrinterName ), #0, dum1, xx);
if (qq > 0) and (trim( strpas( dum1 )) <> '') then
begin
s2 := PrinterName + ',' + strpas( dum1 );
while GetProfileString( cs1, cs2, cs4, dum1, xx) > 0 do
WriteProfileString( cs1, cs2, #0);
WriteProfileString( cs1, cs2, pchar( s2 ));
case Win32Platform of
VER_PLATFORM_WIN32_NT :
SendMessage( HWND_BROADCAST, WM_WININICHANGE, 0,LongInt(cs1));
VER_PLATFORM_WIN32_WINDOWS :
SendMessage( HWND_BROADCAST, WM_SETTINGCHANGE, 0,LongInt(cs1));
end; { case }
Result := True;
end;
finally
FreeMem( dum1 );
end;
end;
任何人有任何提示或更好的方法来做到这一点?
附带说明,这不是我的职责。这是我在寻找解决问题的方法时捡到的一段代码。
更多信息:
打印作业实际上是正在使用的 PDF 打印
ShellExecute(Application.Handle, 'print', PChar(sPath), nil, nil, SW_HIDE);
目标是将默认打印机更改为所选打印机,以便将 pdf 打印到所需的打印机,然后在退出应用程序时将打印机恢复为原始默认值
【问题讨论】:
-
你试过
Printers.PrinterIndex := IndexOfYourPrinter -
我没有。我假设 Printers.PrinterIndex 只有在我使用打印机而不是我们使用的自定义打印类进行打印时才有效。我将对其进行测试,看看是否能给我想要的结果
-
值得一试,但我的自定义打印类使用默认打印机进行打印,并且 Printers.PrinterIndex 不会更改默认值
-
您不应使用默认打印机。您应该使用选定的打印机。更改默认打印机是用户应该做的事情。你不能在他们背后做这件事。
-
你不需要平台案例,因为
WM_WININICHANGE = WM_SETTINGCHANGE。
标签: delphi delphi-2010