Аннотация:
Многие знают, что для перемещения окна на передний план существует функция SetForegroundWindow из Win32 API (в MFC ей соответствует обёртка CWnd::SetForegroundWindow). Она отлично работала под Windows 95 и Window NT. Но потом парни из Майкрософт провозгласили новый принцип: "Никто кроме пользователя не имеет право выдвигать окно на передний план". И хотя их собственные продукты продолжают делать это при необходимости, функция SetForegroundWindow перестала работать, как раньше. Теперь только активный процесс (foreground process) может переместить окно на передний план с использовании этой функции, а окно фонового процесса начнёт "мерцать" на панели задач, чтобы привлечь внимание пользователя.
В общем случае не рекомендуется нарушать правила работы пользовательского интерфейса, предписанные Микрософт. Как правило, окно, выпрыгивающее из ниоткуда, только раздражает пользователя. Тем не менее, в некоторых приложениях бывает необходимо добиться именно такого поведения. Рассмотрим несколько способов достижения требуемого.
--
Я думал, ты огромный страшный Бажище,
А ты недоучка, крохотный Бажик...
BOOL SetWindowPos(HWND,HWND,int,int,int,int,UINT)
Первый параметр дискриптор окна которое надо переместить на передний план
Второй параметр необходимо установить в HWND_TOP или HWND_TOPMOST
а седьмой в SWP_NOSIZE|SWP_NOMOVE
остальные параметры не имеют значения :)))
Главное — это рабочая концепция и ослиная доля упрямства.
Здравствуйте, SVV, Вы писали:
SVV>Приведенный код работал у меня не всегда, поэтому я дополнил его и оформил свою функцию:
В каких ситуациях он у тебя не работал?
Есть очень большая программа.
В определенной ситуации она ''выкидывает'' модальный диалог.
Проблема в том, что иногда если юзер не прореагировал на него, через определенное время ''смежники'' выбрасывают
из другого потока еще один модальный диалог.
Так вот после истечения таймаута надо вернуть фокус первому модальному диалогу и закрыть его с возвращением на строку
if (pDlg->DoModal() == IDOK) в коде родителя.
Я применил для этого базовый код Александра Шаргина :
в OnClose() модального диалога при срабатывании таймера:
В 95% случаев работает ''на ура''.
Но иногда обваливается Debug Assertion Failed: file: wincore.cpp line: 4486.
А именно в строчке ASSERT(ContinueModal()):
// phase2: pump messages while available
do
{
ASSERT(ContinueModal());
..........................................................
Kaкие будут идеи?
Мы знаем: время растяжимо. Оно зависит от того,
Какого рода содержимым Вы заполняете его. (C. Маршак)
Здравствуйте, DmitryT, Вы писали:
DT>Здравствуйте, SVV, Вы писали:
SVV>>Приведенный код работал у меня не всегда, поэтому я дополнил его и оформил свою функцию:
DT>В каких ситуациях он у тебя не работал?
есть определенные приложения, написанные фирмой Wincorr Nixdorf...
... DT>Kaкие будут идеи?
по поводу Assert? никаких идей.
Александр Шаргин
Хотелось бы услышать Ваш ''разбор полетов''...
Особенно, в части перехвата пользовательского ввода функцией AttachThreadInput (подключая свой поток к обработке пользовательского ввода, ты все-таки вмешиваешься в ''нормальную жизнь'' системы).
Не может ли это привести иногда к проблемам в многопоточной программе?
Мы знаем: время растяжимо. Оно зависит от того,
Какого рода содержимым Вы заполняете его. (C. Маршак)
Здравствуйте, DmitryT, Вы писали:
DT>Особенно, в части перехвата пользовательского ввода функцией AttachThreadInput (подключая свой поток к обработке пользовательского ввода, ты все-таки вмешиваешься в ''нормальную жизнь'' системы). DT>Не может ли это привести иногда к проблемам в многопоточной программе?
Здравствуйте, DmitryT, Вы писали:
DT>Почему потеряло актуальность? DT>Почему лучше?
все остальные способы, включая тот что с AttachThreadInput() и их комбинации, срабатывают не всегда (результат собственных экспериментов), а этот действует железно.
DT>Тем более, мы находимся в той же программв, а не управляем из другой программы...
результат нестабильный, включая "в той же программе".
Здравствуйте, Odi$$ey, Вы писали:
OE>все остальные способы, включая тот что с AttachThreadInput() и их комбинации, срабатывают не всегда (результат собственных экспериментов), а этот действует железно.
Но как-то немного ''неловко'' "в той же программе", в том же окне (модальный диалог), посылать себе же
что-то типа:
чтобы закрыть его с возвращением на строку if (pDlg->DoModal() == IDOK) в коде родителя.
OE>результат нестабильный, включая "в той же программе".
И в Вашем методе результат нестабильный?
Мы знаем: время растяжимо. Оно зависит от того,
Какого рода содержимым Вы заполняете его. (C. Маршак)
АШ>Авторы: АШ> Александр Шаргин
АШ>Аннотация: АШ>Многие знают, что для перемещения окна на передний план существует функция SetForegroundWindow из Win32 API (в MFC ей соответствует обёртка CWnd::SetForegroundWindow). Она отлично работала под Windows 95 и Window NT. Но потом парни из Майкрософт провозгласили новый принцип: "Никто кроме пользователя не имеет право выдвигать окно на передний план". И хотя их собственные продукты продолжают делать это при необходимости, функция SetForegroundWindow перестала работать, как раньше. Теперь только активный процесс (foreground process) может переместить окно на передний план с использовании этой функции, а окно фонового процесса начнёт "мерцать" на панели задач, чтобы привлечь внимание пользователя.
АШ>В общем случае не рекомендуется нарушать правила работы пользовательского интерфейса, предписанные Микрософт. Как правило, окно, выпрыгивающее из ниоткуда, только раздражает пользователя. Тем не менее, в некоторых приложениях бывает необходимо добиться именно такого поведения. Рассмотрим несколько способов достижения требуемого.
Добрый день всем.
Скажите, а есть решение, которое работает на XP SP3? Сейчас попробывал все те, что указаны в статье — не работают. Самое интересное в третьем случае, SetForegroundWindow просто возвращает ложь, при этом GetLastError возвращает 0...
А нужна программка для переключение приложений, причем висящая как демон, без собственного интерфейса(активизируется по хуку, когда что-то подносят к сканеру штрихкодов, вобщем, не вирусы пишу ).
Новости очень смешные. Зря вы не смотрите. Как будто за наркоманами подсматриваешь. Только тетка с погодой в завязке.
There is no such thing as a winnable war.
Здравствуйте, Eugeny__, Вы писали:
E__>Скажите, а есть решение, которое работает на XP SP3? Сейчас попробывал все те, что указаны в статье — не работают. Самое интересное в третьем случае, SetForegroundWindow просто возвращает ложь, при этом GetLastError возвращает 0... E__>А нужна программка для переключение приложений, причем висящая как демон, без собственного интерфейса(активизируется по хуку, когда что-то подносят к сканеру штрихкодов, вобщем, не вирусы пишу ).
Как вариант можно использовать SwitchToThisWindow. У меня оно точно работает вплоть до висты.