PrintDialog поверх остальных окон - C#

Узнай цену своей работы

Формулировка задачи:

Здравствйте! Есть программа, она ждет пока в определенной папке появится файл и когда он там оказывается, выводит его на печать. Проблема в том, что диалог печати при выводе не становится активным, и не появляется поверх остальных окон. Пол дня бьюсь над этой проблемой, нормального решения так и не нашел. Помогите пожалуйста, время поджимает, программу надо сдавать.
// Create the print dialog object and set options
PrintDialog pDialog = new PrintDialog();
pDialog.AllowSomePages = true;
pDialog.ShowHelp = true;
 
DialogResult result = pDialog.ShowDialog();
 
// If the result is OK then print the document
if (result == DialogResult.OK)
{
    PrintDocument D = new PrintDocument();
    D.DocumentName = destFile;
    D.Print();
}
Нашел решение через Windows API:
using System.Runtime.InteropServices;
 
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
 
[DllImport("user32.dll")]
public static extern IntPtr SetForegroundWindow(IntPtr hWnd);
 
IntPtr printWnd = FindWindow(null, "Печать");
SetForegroundWindow(printWnd);
Тоесть, сначала мы импортируем библиотеки Windows, затем при помощи функции FindWindow пытаемся определить hWnd окна с заголовком "Печать". После этого делаем окно с этим hWnd активным, при помощи функции SetForegroundWindow. Но и здесь меня ждала неудача, FindWindow вернула нулевое значение.

Решение задачи: «PrintDialog поверх остальных окон»

textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Threading;
 
namespace ca6
{
    public class SetForegroundPrintdialog
    {
        [DllImport("user32.dll")]
        public static extern IntPtr SetForegroundWindow(IntPtr hWnd);
 
        // For Windows Mobile, replace user32.dll with coredll.dll
        [DllImport("user32.dll", SetLastError = true)]
        static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
 
        public static IntPtr GetPrintHWnd(int n)
        {
            if (n > 0)
            {
                Thread.Sleep(200);
                IntPtr printWnd = FindWindow(null, "Печать");
                if (printWnd.ToString() == "0")
                {
                    return GetPrintHWnd(n - 1);
                }
                else
                {
                    return printWnd;
                }
            }
            else
            {
                IntPtr printWnd = FindWindow(null, "Печать");
                return printWnd;
            }
        }
 
        public static void Main()
        {
            SetForegroundWindow(GetPrintHWnd(30));
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 3.7 из 5