Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
Haaard

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

17.03.2010, 21:41. Показов 3778. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствйте!

Есть программа, она ждет пока в определенной папке появится файл и когда он там оказывается, выводит его на печать. Проблема в том, что диалог печати при выводе не становится активным, и не появляется поверх остальных окон. Пол дня бьюсь над этой проблемой, нормального решения так и не нашел. Помогите пожалуйста, время поджимает, программу надо сдавать.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 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();
}
Добавлено через 30 минут
Нашел решение через Windows API:

C#
1
2
3
4
5
6
7
8
9
10
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 вернула нулевое значение.
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.03.2010, 21:41
Ответы с готовыми решениями:

Окно поверх всех окон
Пишу программу против винлокеров добавил свой диспетчер задач, разблокирование ключей реестра.Но есть одна проблема окно просто не работает...

Окно сохранения поверх других окон Excel
создал форму, на ней есть кнопка... если простым языком, то по нажатию кнопки выполняется данный код: Excel.Application app = new...

Поверх всех окон. включая диспетчера задач
Подскажите как на C# сделать так ,что бы форма была поверх всех окон, включая диспетчера задач.

3
 Аватар для HIMen
4340 / 1509 / 101
Регистрация: 12.04.2009
Сообщений: 2,342
17.03.2010, 21:47
Цитата Сообщение от Haaard Посмотреть сообщение
FindWindow(null, "Печать");
WinApi не знаю, но думаю там нет null, попробуйте IntPtr.Zero
0
Haaard
18.03.2010, 12:19
Спасибо, но ошибка, к сожалению не в этом. Оба параметра там типа string:
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
Первый параметр - имя класса, который мне не известен, null в этом случае - допустимое значение; второй параметр - заголовок окна.

Функция FindWindow

Описание:
function FindWindow(ClassName, WindowName: PChar): HWnd;
Находит pодительское окно веpхнего уpовня с совпадающими ClassName и WindowName. Не осуществляет поиск дочеpних окон.
Паpаметpы:
ClassName: Имя класса окна (заканчивающееся пустым символом, nil - если все классы).
WindowName: Текстовый заголовок окна или 0, если все окна.
Возвpащаемое значение:
Описатель окна; 0 - если такого окна нет.
функция находится в файле user32.dll
Добавлено через 4 минуты
Есть надежда, что я в корне заблуждаюсь. И решение надо искать не в WinAPI, а в способе вызова диалога. К примеру, каким-то образом, перед его вызовом задать свойство "OnTop", или что-то в этом роде. Надеюсь кто-то из Вас с этим сталкивался.

Добавлено через 14 часов 9 минут
Решение
Нашел решение, все так же, через WinAPI, только запускается отдельный процесс, который уже и выводит диалог печати на передний план.

В основной программе ставим запуск этой программы (ca6.exe) перед вызовом диалогового окна:
C#
1
2
Process.Start(@"C:\ca6.exe");
DialogResult result = pDialog.ShowDialog();
А вот листинг самой программы ca6:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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));
        }
    }
}
В программе добавлена рекурсия, с той целью, что в моем случае PrintDialog, может сформироваться с задержкой, к примеру при печати большого документа, а рекурсия как раз отлавливает момент его появления, и если в течении 6 секунд (200 мс х 30), он так и не появляется, возвращает пустое значение.
CEO
Эксперт С++
 Аватар для Alligieri
2258 / 1248 / 57
Регистрация: 16.03.2009
Сообщений: 3,588
18.03.2010, 12:47
Цитата Сообщение от Haaard Посмотреть сообщение
Первый параметр - имя класса, который мне не известен, null в этом случае - допустимое значение; второй параметр - заголовок окна.
В наборе Visual Studio есть утилита Spy++ (spyxx.exe) - она позволяет узнать заголовки и классы всех запущенных оконных процессов.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.03.2010, 12:47
Помогаю со студенческими работами здесь

Таймер поверх всех окон
ребят подскажите как cделать вывод текста который меняется переменой timer поверх всех окон напрямую на монитор чтобы видно было даже при...

Поставить форму поверх других окон по таймеру
Поставить форму поверх других окон по таймеру. Т.е. форма не должна быть в Topmost, а просто стать поверх других.

WPF открыть окно поверх всех окон но не Topmost и не owner = this
Ребят как сделать открытие окон такое же как и в win form ? ну то есть чтобы не поверх всех окон в windows (topmost) а только поверх всех...

Как сделать так, чтобы мое приложение было поверх других окон?
Всем привет! Есть у меня некое приложение и я хочу сделать так, чтобы оно отображалось поверх всех других окон. Т.е. копаюсь я в браузере...

Messagebox поверх всех окон.
Есть программа, при срабатывании таймера выводится messagebox. Часто бывает такое, что если открыты какие-либо окна, messagebox появляется...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru