2009-07-01 13 views
0

一連のページを印刷するプログラムがあり、各ページの後に停止して印刷するかどうかをユーザーに確認し、印刷する用紙を挿入する。問題は、状況によっては、印刷進行状況ウィンドウをポップアップさせるアイテムを印刷してから、そのウィンドウが消えると、フォームにフォーカスを戻そうとします。しかし、その時までに次のモーダルダイアログが表示され、元のウィンドウが再フォーカスされなくなります。モーダルダイアログは、印刷後のフォーカスの復帰を妨げる。

場合によっては、元のフォームをカバーするために背景からウィンドウを表示することもあります。印刷後にダイアログを表示しないとうまく動作しますが、それは本当にオプションではありません。これは特定のプリンタでのみ発生します。

他の誰かがこの問題に遭遇した場合、どのように修正しましたか?

サンプルコード:

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

答えて

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

私は、私は状態を照会し、それが次のページに移動する前に、再びアイドル状態になるまで待つことができ、そのように使用されているプリンタを知ることができるように私は、プリントダイアログを追加しました。この新しいコードが必要になります。

using Management; 
using Threading; 
+0

私はあなたの答えを見て、あなたのコードをテストプログラムに入れようとしました。残念ながら、元の問題(問題のある物理的なプリンタにアクセスできない)を再現するのは難しいですが、何かを稼働させようとします。私は睡眠声明を実験したと思うし、前には何も効果がなかったと思うので、あまり期待していないが、少なくとも試してみる。 –

0

私はちょうど今、同じ問題に直面し、残念ながらいくつかのポストから最適なソリューションを見つけることができません。私は少し実験を行い、コードは私のために働いています。

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

関連する問題