Russian Qt Forum
Ноябрь 25, 2024, 11:51 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Как вывести окно на передний план после загрузки приложения.  (Прочитано 22351 раз)
spectre71
Гость
« : Июнь 26, 2009, 10:55 »

При загрузке приложения у меня выводиться "Splash" со статусом загрузки, после этого "Splash" пропадает и показывается главное окно.
Если во время загрузки пользователь ткнул в какое-либо окно другого приложения, то мое главное окно не выходит на передний план.
Как сделать так, чтобы оно вышло на передний план?
Записан
spectre71
Гость
« Ответ #1 : Июнь 26, 2009, 11:48 »

Код
C++ (Qt)
 sb_pipeline2 w;
 w.show();
 w.raise();  
 w.activateWindow();
 return a.exec();

Не помогает!
Записан
BaltikS
Гость
« Ответ #2 : Июнь 26, 2009, 12:00 »

Я думаю это дело ОС или оконного менеджера. А средствами qt - думаю никак...
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #3 : Июнь 26, 2009, 12:47 »

http://www.prog.org.ru/topic_7365_0.html
Записан
spectre71
Гость
« Ответ #4 : Июнь 26, 2009, 12:58 »

Смотрел я эту тему. Но решения проблемы там не нашел.
Под Windows точно не работает!
Если знаешь решение, напиши.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #5 : Июнь 26, 2009, 13:08 »

а, так под виндз Улыбающийся Там тоже это упомянуто, что это решение только под X11. Под виндз не знаю.
Записан
spectre71
Гость
« Ответ #6 : Июнь 26, 2009, 13:33 »

а, так под виндз Улыбающийся Там тоже это упомянуто, что это решение только под X11. Под виндз не знаю.

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

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

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

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

Но это не работает
Записан
BELNETMON
Гость
« Ответ #7 : Июнь 26, 2009, 14:18 »

Под виндой начиная с XP (или даже с 2000й) приложение никаким боком не может на себя забрать фокус. Это продуманное и очень правильное системное поведение. Приложение выбирает пользователь и работает в нем, но переключить на другое его никто не может.
Записан
ритт
Гость
« Ответ #8 : Июнь 26, 2009, 14:20 »

пздж /* уж извините */
Код:
#ifdef Q_OS_WIN
AllowSetForegroundWindow(ASFW_ANY);
#endif
Записан
spectre71
Гость
« Ответ #9 : Июнь 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();

Не помогает!
Записан
SABROG
Гость
« Ответ #10 : Июнь 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 например) или вообще кнопку другой программы, которую я жать даже не собирался.
« Последнее редактирование: Июнь 26, 2009, 15:18 от SABROG » Записан
spectre71
Гость
« Ответ #11 : Июнь 26, 2009, 15:51 »

SABROG, Спасибо за инфу.
AllowSetForegroundWindow в одном случае помогла - при поднятии окна из трея
При попытке повторного  запуска программы, она отсылает сообщение уже запущенному экземпляру  который должен стать Foreground
До этого если прога была свернута в трее, она поднималось, но неперемещалась наверх!
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #12 : Июль 05, 2009, 15:34 »

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

Тоже считаю что программа не должна брать на себя фокус. Особенно бесит когда в Windows запускаешь программу - и идешь бродить в меню - только доходишь до нужного пункта, а вдруг запущенная программа берет на себя фокус закрывая окно меню, и приходиться лезть заново. Временами просто с ума сводит. Я хочу сам тыкать мышкой и чтобы тычилось туда куда я тыкаю а не сами окошки должны передо мной возникать, непойми как.
Записан
ритт
Гость
« Ответ #13 : Июль 06, 2009, 03:03 »

break, если тебя такие мелочи и сразу бесят, попользуй kopete из 4.2.х - вообще психом станешь Улыбающийся
Записан
Djinn
Гость
« Ответ #14 : Июль 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 наверн никак, раз профессионалы говорят...
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.187 секунд. Запросов: 23.