Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: spectre71 от Июнь 26, 2009, 10:55



Название: Как вывести окно на передний план после загрузки приложения.
Отправлено: spectre71 от Июнь 26, 2009, 10:55
При загрузке приложения у меня выводиться "Splash" со статусом загрузки, после этого "Splash" пропадает и показывается главное окно.
Если во время загрузки пользователь ткнул в какое-либо окно другого приложения, то мое главное окно не выходит на передний план.
Как сделать так, чтобы оно вышло на передний план?


Название: Re: Как вывести окно на передний план после загрузки приложения.
Отправлено: spectre71 от Июнь 26, 2009, 11:48
Код
C++ (Qt)
 sb_pipeline2 w;
 w.show();
 w.raise();  
 w.activateWindow();
 return a.exec();

Не помогает!


Название: Re: Как вывести окно на передний план после загрузки приложения.
Отправлено: BaltikS от Июнь 26, 2009, 12:00
Я думаю это дело ОС или оконного менеджера. А средствами qt - думаю никак...


Название: Re: Как вывести окно на передний план после загрузки приложения.
Отправлено: Alex Custov от Июнь 26, 2009, 12:47
http://www.prog.org.ru/topic_7365_0.html


Название: Re: Как вывести окно на передний план после загрузки приложения.
Отправлено: spectre71 от Июнь 26, 2009, 12:58
http://www.prog.org.ru/topic_7365_0.html
Смотрел я эту тему. Но решения проблемы там не нашел.
Под Windows точно не работает!
Если знаешь решение, напиши.


Название: Re: Как вывести окно на передний план после загрузки приложения.
Отправлено: Alex Custov от Июнь 26, 2009, 13:08
а, так под виндз :) Там тоже это упомянуто, что это решение только под X11. Под виндз не знаю.


Название: Re: Как вывести окно на передний план после загрузки приложения.
Отправлено: spectre71 от Июнь 26, 2009, 13:33
а, так под виндз :) Там тоже это упомянуто, что это решение только под X11. Под виндз не знаю.

Там под Windows как раз якобы было решение

Похожая фигня у меня сейчас (кути 4.4) - под виндой набор

        w->show();
        w->raise();
        w->activateWindow();  // это должно быть обязательно после show()

работает, но под КДЕ не хочет.

Но это не работает


Название: Re: Как вывести окно на передний план после загрузки приложения.
Отправлено: BELNETMON от Июнь 26, 2009, 14:18
Под виндой начиная с XP (или даже с 2000й) приложение никаким боком не может на себя забрать фокус. Это продуманное и очень правильное системное поведение. Приложение выбирает пользователь и работает в нем, но переключить на другое его никто не может.


Название: Re: Как вывести окно на передний план после загрузки приложения.
Отправлено: ритт от Июнь 26, 2009, 14:20
пздж /* уж извините */
Код:
#ifdef Q_OS_WIN
AllowSetForegroundWindow(ASFW_ANY);
#endif


Название: Re: Как вывести окно на передний план после загрузки приложения.
Отправлено: spectre71 от Июнь 26, 2009, 14:42
пздж /* уж извините */
Код:
#ifdef Q_OS_WIN
AllowSetForegroundWindow(ASFW_ANY);
#endif

Код
C++ (Qt)
 sb_pipeline2 w;
 w.show();
 w.raise();  
 w.activateWindow();
#ifdef Q_OS_WIN
AllowSetForegroundWindow(ASFW_ANY);
#endif
 return a.exec();

Не помогает!


Название: Re: Как вывести окно на передний план после загрузки приложения.
Отправлено: SABROG от Июнь 26, 2009, 14:49
пздж /* уж извините */

Из ремарки к функции понятно, что это даже не то что для Qt, а вообще для любой программы не правильное поведение.

Код:
    Starting with Microsoft Windows 98 and Windows 2000, the system restricts which processes can set the foreground window. A process can set the foreground window only if one of the following conditions is true:

        * The process is the foreground process.
        * The process was started by the foreground process.
        * The process received the last input event.
        * There is no foreground process.
        * The foreground process is being debugged.
        * The foreground is not locked (see LockSetForegroundWindow).
        * The foreground lock time-out has expired (see SPI_GETFOREGROUNDLOCKTIMEOUT in SystemParametersInfo).
        * Windows 2000/XP: No menus are active.

    A process that can set the foreground window can enable another process to set the foreground window by calling AllowSetForegroundWindow. The process specified by dwProcessId loses the ability to set the foreground window the next time the user generates input, unless the input is directed at that process, or the next time a process calls AllowSetForegroundWindow, unless that process is specified.

    Windows 95/98/Me: This function is not implemented. Therefore, processes must cooperate to manage the foreground window. For example, an application may wish to support only one instance. When the second instance starts up, it should detect the previous instance and call SetForegroundWindow on the window of the previous instance. It should not post a message to the window of the previous instance asking it to call SetForegroundWindow on itself, because the previous instance will not necessarily have permission to call SetForegroundWindow.

Из FAQ'a эхи SU.WIN32.PROG:
Цитировать
2.05. Когда вызываешь ShowWindow(...,SW_SHOW) из пpоцесса, не являющегося
       foreground, на таскбаpе начинает мигать таб, соответствующий окошку.
       Как заставить окно откpываться сpазу?

       AllowSetForegroundWindow() или посылать ему клик по Caption. :)
       комментарий: AllowSetForegroundWindow вызывать должен фореграунд
       процесс, чтобы позволить другим процессам делать свое окно активным.
       Так что этот метод применим только с использованием хука.

Не могу не согласится, что это должно быть на усмотрение пользователя - как опция в программе, но никак не насильно. Я сам на работе часто сталкиваюсь с тем, что пишу кому-нибудь письмо или кликаю куда-нибудь, а всплывает дурацкий NAG скрин какого-нибудь update'a какой-нибудь программы и в итоге я кликаю на рекламный баннер (Avira например) или вообще кнопку другой программы, которую я жать даже не собирался.


Название: Re: Как вывести окно на передний план после загрузки приложения.
Отправлено: spectre71 от Июнь 26, 2009, 15:51
SABROG, Спасибо за инфу.
AllowSetForegroundWindow в одном случае помогла - при поднятии окна из трея
При попытке повторного  запуска программы, она отсылает сообщение уже запущенному экземпляру  который должен стать Foreground
До этого если прога была свернута в трее, она поднималось, но неперемещалась наверх!


Название: Re: Как вывести окно на передний план после загрузки приложения.
Отправлено: break от Июль 05, 2009, 15:34
Цитировать
Не могу не согласится, что это должно быть на усмотрение пользователя - как опция в программе, но никак не насильно. Я сам на работе часто сталкиваюсь с тем, что пишу кому-нибудь письмо или кликаю куда-нибудь, а всплывает дурацкий NAG скрин какого-нибудь update'a какой-нибудь программы и в итоге я кликаю на рекламный баннер (Avira например) или вообще кнопку другой программы, которую я жать даже не собирался.

Тоже считаю что программа не должна брать на себя фокус. Особенно бесит когда в Windows запускаешь программу - и идешь бродить в меню - только доходишь до нужного пункта, а вдруг запущенная программа берет на себя фокус закрывая окно меню, и приходиться лезть заново. Временами просто с ума сводит. Я хочу сам тыкать мышкой и чтобы тычилось туда куда я тыкаю а не сами окошки должны передо мной возникать, непойми как.


Название: Re: Как вывести окно на передний план после загрузки приложения.
Отправлено: ритт от Июль 06, 2009, 03:03
break, если тебя такие мелочи и сразу бесят, попользуй kopete из 4.2.х - вообще психом станешь :)


Название: Re: Как вывести окно на передний план после загрузки приложения.
Отправлено: Djinn от Июль 06, 2009, 17:41
При загрузке приложения у меня выводиться "Splash" со статусом загрузки, после этого "Splash" пропадает и показывается главное окно.
Если во время загрузки пользователь ткнул в какое-либо окно другого приложения, то мое главное окно не выходит на передний план.
Как сделать так, чтобы оно вышло на передний план?

Цитировать
Выводим окно на передний план:

  SetWindowPos ( hwndYourWindow, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE );

Возвращаем в обратное состояние:

  SetWindowPos ( hwndYourWindow, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE );

Вот вариант чисто для Windows.

Методами qt наверн никак, раз профессионалы говорят...


Название: Re: Как вывести окно на передний план после загрузки приложения.
Отправлено: z11t3 от Апрель 21, 2010, 04:53
Под виндой начиная с XP (или даже с 2000й) приложение никаким боком не может на себя забрать фокус. Это продуманное и очень правильное системное поведение. Приложение выбирает пользователь и работает в нем, но переключить на другое его никто не может.
Неправда ваша. Провожу модернизацию системы диспетчерского управления (новый билд, старый писан Delphi - благо модулями). Оперативный персонал работает с программой в Full-screen (электрическая схема на весь экран, прочему софту там вообще делать нечего).
В общем жаль если действительно средствами QT не вывести запущенное приложение "выше" всех по Z индексу.
Попробую с вами пока не согласится и как-то исправить упущение, не используя платформо-зависимого кода.


Название: Re: Как вывести окно на передний план после загрузки приложения.
Отправлено: SABROG от Апрель 21, 2010, 08:25
Неправда ваша. Провожу модернизацию системы диспетчерского управления (новый билд, старый писан Delphi - благо модулями). Оперативный персонал работает с программой в Full-screen (электрическая схема на весь экран, прочему софту там вообще делать нечего).
Оперативный персонал калеки и не могут ткнуть мышкой в нужное окно? В Qt Full-screen не тоже самое, что в играх. Qt не меняет разрешение экрана.

Я сам на работе часто сталкиваюсь с проблемой "слишком умных" программ, которые "лезут под мышку", когда я пытаюсь совершить какое-то действие в другой программе. Частенько нажимал туда куда даже не собирался. Можно представить себе последствия подобных нажатий где нибудь в Firefox на запрос установки програмного обеспечения с какого нибудь вредоносного сайта.


Название: Re: Как вывести окно на передний план после загрузки приложения.
Отправлено: lit-uriy от Апрель 21, 2010, 11:12
>>не могут ткнуть мышкой в нужное окно?
её у них может вообще не быть если это имитация диспетчерского щита, равно как и клавиатуры


Название: Re: Как вывести окно на передний план после загрузки приложения.
Отправлено: break от Апрель 21, 2010, 22:24
Под виндой начиная с XP (или даже с 2000й) приложение никаким боком не может на себя забрать фокус. Это продуманное и очень правильное системное поведение. Приложение выбирает пользователь и работает в нем, но переключить на другое его никто не может.
Неправда ваша. Провожу модернизацию системы диспетчерского управления (новый билд, старый писан Delphi - благо модулями). Оперативный персонал работает с программой в Full-screen (электрическая схема на весь экран, прочему софту там вообще делать нечего).
В общем жаль если действительно средствами QT не вывести запущенное приложение "выше" всех по Z индексу.
Попробую с вами пока не согласится и как-то исправить упущение, не используя платформо-зависимого кода.

Не пойму а в чем неправда? Персонал работает с развернутым на весь экран окном - вероятнее всего это программа как то автозапуском запускается при старте компа, но по сути ее выбрал сам человек - система не должна давать возможность брать на себя фокус другим окошкам, от других программ. Обычно при такой ситуации окно мигает в "статус баре" (когда оно рыпнулось вылезти на первый план - но система не дала).

Мне приходилось что-то подобное настраивать - обошелся showFullscreen(); для Qt-шных виджетов и тонкой настройкой целевой системы - убиранием всяких программ которые потенциально могли бы даже пытаться вылезти на первый план. Получился такой настроенный образ системы - который меняется редко, сначала заливается он на чистую машину - потом софт - что-то типа вашей электрической схемы.

Еще можно писать всякие супер хако-программки - периодически сворачивающие другие окна кроме требуемого, или воспользоваться готовым решением - например в KDE 3 можно было для окошек с конкретным классом задать такие параметры, как находиться на самом верхнем уровне и т.д. Но все это естественно уже не через Qt а через API конкретной системы...


Название: Re: Как вывести окно на передний план после загрузки приложения.
Отправлено: SABROG от Апрель 22, 2010, 01:20
>>не могут ткнуть мышкой в нужное окно?
её у них может вообще не быть если это имитация диспетчерского щита, равно как и клавиатуры
Для этих целей достаточно флага Qt::WindowStaysOnTopHint.