簡體   English   中英

模式對話框防止打印后返回焦點

[英]Modal dialog prevents return of focus after printing

我有一個程序可以打印一系列頁面,在每頁之后停止,要求用戶驗證他們是否要打印並插入要打印的紙張。 問題是,在某些情況下,它會走並打印該項目,這會彈出一個打印進度窗口,然后當該窗口消失時,它會嘗試將焦點返回到表單。 但是到那時,將顯示下一個模式對話框,這將阻止原始窗口重新聚焦。

有時甚至從背景中彈出一個窗口來覆蓋我的原始表單。 如果我在打印后不顯示任何對話框,則效果很好,但這不是真正的選擇。 這僅在某些打印機上發生。

如果有其他人遇到此問題,您如何解決?

樣例代碼:

private void Print(int ItemCount)
{
    for (int i = 0; i < ItemCount; i++)
    {
        MessageBox.Show("Insert paper to print to.");
        using (PrintDocument PrintDoc = new PrintDocument())
        {
            PrintDoc.PrintPage += new PrintPageEventHandler(PrintDoc_PrintPage);
            PrintDoc.Print();
        }
    }
}

void PrintDoc_PrintPage(object sender, PrintPageEventArgs e)
{
    e.Graphics.DrawEllipse(Pens.Black, new Rectangle(10, 10, 100, 100));
    e.HasMorePages = false;
}

我認為您的解決方案是查詢打印機,等到“空閑”后再進入下一頁。 這樣一來,它就無法超越自身並顯示導致其失去焦點的對話框。 一些打印驅動程序顯示對話框(例如pdf編寫器),這些對話框會掛起打印輸出,而后面的代碼仍在繼續。

PrintDialog pd = new PrintDialog();
pd.ShowDialog();
for (int i = 0; i < ItemCount; i++)
{
MessageBox.Show("Insert paper to print to.");
using (PrintDocument PrintDoc = new PrintDocument())
{
    PrintDoc.PrinterSettings = pd.PrinterSettings;
    PrintDoc.PrintPage += new PrintPageEventHandler(PrintDoc_PrintPage);
    PrintDoc.Print();
}
object status = Convert.ToUInt32(9999);
while ((uint)status != 0) // 0 being idle
{
    ManagementObjectSearcher mos = new ManagementObjectSearcher("select * from Win32_Printer where Name='" + pd.PrinterSettings.PrinterName + "'");
    foreach (ManagementObject service in mos.Get())
    {
    status = service.Properties["PrinterState"].Value;
    Thread.Sleep(50);
    }
}
}

我添加了PrintDialog,這樣我就可以知道正在使用哪台打印機,這樣我就可以查詢狀態並等到它再次空閑后再進入下一頁。 此新代碼將要求:

using Management;
using Threading;

我現在遇到了同樣的問題,很遺憾,從幾篇文章中找不到最佳的解決方案。 我做了一些實驗,下面的代碼對我有用。

System.Threading.Tasks.Task.Factory.StartNew(()=> Print());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM