gpt4 book ai didi

delphi - 如何在TWebBrowser中检测打印命令是否完成?

转载 作者:行者123 更新时间:2023-12-03 15:50:48 26 4
gpt4 key购买 nike

procedure TForm1.Button1Click(Sender: TObject);
var
vaIn, vaOut: OleVariant;
begin
WebBrowser1.Navigate('http://www.google.com');
while WebBrowser1.ReadyState < READYSTATE_COMPLETE do
Application.ProcessMessages;
WebBrowser1.ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_PROMPTUSER, vaIn, vaOut);

// HOWTO: WAIT until print <strike>job</strike> dialog is done or canceled

// UPDATE (1):
WebBrowser1.Enabled := False;
WebBrowser1.OnCommandStateChange := WebBrowser1CommandStateChange;
end;

procedure TForm1.WebBrowser1CommandStateChange(Sender: TObject; Command: Integer; Enable: WordBool);
begin
Memo1.Lines.Add(Format('%d : %d : %d', [WebBrowser1.QueryStatusWB(OLECMDID_PRINT), Command, Ord(Enable)]));
// TODO: after LAST event when the print dialog closes:
// WebBrowser1.OnCommandStateChange := nil;
end;

预览也是如此:WebBrowser1.ExecWB(OLECMDID_PRNTPREVIEW, OLECMDEXECOPT_DODEFAULT, vaIn, vaOut);

我需要等待(或触发事件),直到打印/打印预览对话框完成,并且用户选择了打印或取消。

更新 (1)

基于this question我测试了OnCommandStateChange。它在“打印”对话框中打印或取消后触发。但对话框打开之前可以触发 1 或 2 次。

更新 (2)找到了一个可以解决问题的解决方法(这是一个基本想法):

procedure TForm1.WaitPrintDialog;
var
t1, t2: DWORD;
w, wpd: HWND;
begin
t1 := GetTickCount();
t2 := t1;
wpd := 0;
while ((wpd = 0) and (t2 - t1 <= 5000)) do // 5 sec timeout
begin
w := FindWindowEx(0, 0, 'Internet Explorer_TridentDlgFrame', nil);
if (w <> 0) and (GetWindow(w, GW_OWNER) = Self.Handle) then
begin
wpd := w;
end;
Application.ProcessMessages;
t2 := GetTickCount();
end;
if wpd <> 0 then // found and no timeout
while IsWindow(wpd) and (not Application.Terminated) do
begin
Application.HandleMessage; // Application.ProcessMessages;
end;
end;

用法:

WebBrowser1.ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_PROMPTUSER, vaIn, vaOut);
WaitPrintDialog;
ShowMessage('Print Done!');

适用于 OLECMDID_PRINTOLECMDID_PRNTPREVIEW请告诉我你的想法...

最佳答案

当我一直在寻找解决方案时,我找到了 PRINT_WAITFORCOMPLETION几天前标记但无法让它工作。这个技巧非常简单(参见 note nr. 4)。我传递 ExecWB 的第三个参数是错误的OLECMDID_PRINT的方法命令作为变体类型 VT_I4但它已重载并且为 PRINT_WAITFORCOMPLETION必须转换为精确类型 VT_I2 ,在 Delphi 中表示为 smallint .

这里是如何使打印对话框模式化(也偶然回答 this :)

procedure TForm1.Button1Click(Sender: TObject);
var
vaIn: OleVariant;
vaOut: OleVariant;
const
PRINT_WAITFORCOMPLETION = $02;
begin
WebBrowser1.Navigate('http://www.google.com');
while WebBrowser1.ReadyState < READYSTATE_COMPLETE do
Application.ProcessMessages;

vaIn := OleVariant(VarAsType(PRINT_WAITFORCOMPLETION, varSmallint));
WebBrowser1.ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_PROMPTUSER, vaIn, vaOut);

ShowMessage('Print dialog has been closed ...');
end;

不幸的是,如果用户将文档发送到打印机队列或取消对话框,您将无法获得任何反馈。 IDM_PRINT没有输出值,这将返回 this。另一件事是,即使用户接受打印对话框,也不意味着文档将被物理打印。为此,正如雷米所说,您必须监视打印机队列。

关于delphi - 如何在TWebBrowser中检测打印命令是否完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8376618/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com