“模态”对话框可防止打印后返回焦点

时间:2009-07-01 18:47:25

标签: c# focus printing modal-dialog

我有一个打印一系列页面的程序,在每个页面后停下来要求用户验证他们是否要打印并插入要打印的纸张。问题是,在某些情况下,它会打印项目,弹出打印进度窗口,然后当该窗口消失时,它会尝试将焦点返回到表单。但到那时,正在显示下一个模态对话框,这会阻止原始窗口重新聚焦。

有时它甚至会从背景中带出一个窗口来覆盖我的原始形式。如果我在打印后没有显示任何对话框,它可以正常工作,但这不是一个真正的选择。这仅适用于某些打印机。

如果其他人遇到此问题,您是如何解决的?

示例代码:

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;
}

2 个答案:

答案 0 :(得分:0)

我认为您的解决方案是查询打印机并等到“空闲”,然后再继续下一页。这样它就不会超前,并显示导致它失去焦点的对话框。一些打印驱动程序显示对话框(如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;

答案 1 :(得分:0)

我刚才面临同样的问题,遗憾的是无法从几个帖子中找到最佳解决方案。我做了一个小实验,下面的代码对我有用。

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