[英]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.