Аннотация:
Многие знают, что для перемещения окна на передний план существует функция SetForegroundWindow из Win32 API (в MFC ей соответствует обёртка CWnd::SetForegroundWindow). Она отлично работала под Windows 95 и Window NT. Но потом парни из Майкрософт провозгласили новый принцип: "Никто кроме пользователя не имеет право выдвигать окно на передний план". И хотя их собственные продукты продолжают делать это при необходимости, функция SetForegroundWindow перестала работать, как раньше. Теперь только активный процесс (foreground process) может переместить окно на передний план с использовании этой функции, а окно фонового процесса начнёт "мерцать" на панели задач, чтобы привлечь внимание пользователя.
В общем случае не рекомендуется нарушать правила работы пользовательского интерфейса, предписанные Микрософт. Как правило, окно, выпрыгивающее из ниоткуда, только раздражает пользователя. Тем не менее, в некоторых приложениях бывает необходимо добиться именно такого поведения. Рассмотрим несколько способов достижения требуемого.
--
Я думал, ты огромный страшный Бажище,
А ты недоучка, крохотный Бажик...
Здравствуйте, DmitryT, Вы писали:
DT>Особенно, в части перехвата пользовательского ввода функцией AttachThreadInput (подключая свой поток к обработке пользовательского ввода, ты все-таки вмешиваешься в ''нормальную жизнь'' системы). DT>Не может ли это привести иногда к проблемам в многопоточной программе?
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>Почему потеряло актуальность? 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. У меня оно точно работает вплоть до висты.
Здравствуйте, YuriKobets, Вы писали:
YK>Здравствуйте, Eugeny__, Вы писали:
E__>>Скажите, а есть решение, которое работает на XP SP3? Сейчас попробывал все те, что указаны в статье — не работают. Самое интересное в третьем случае, SetForegroundWindow просто возвращает ложь, при этом GetLastError возвращает 0... E__>>А нужна программка для переключение приложений, причем висящая как демон, без собственного интерфейса(активизируется по хуку, когда что-то подносят к сканеру штрихкодов, вобщем, не вирусы пишу ).
YK>Как вариант можно использовать SwitchToThisWindow. У меня оно точно работает вплоть до висты.
Почему-то способ работает только при включенной студии(даже если процесс запускать не из студии). Как только студию выгрузить, на одно из приложений переключается нормально, а вот жавовский фрейм заставляет мигать в трее, а это ну никак не то, что я хотел.
Новости очень смешные. Зря вы не смотрите. Как будто за наркоманами подсматриваешь. Только тетка с погодой в завязке.
There is no such thing as a winnable war.
Здравствуйте, Eugeny__, Вы писали:
E__>Почему-то способ работает только при включенной студии(даже если процесс запускать не из студии). Как только студию выгрузить, на одно из приложений переключается нормально, а вот жавовский фрейм заставляет мигать в трее, а это ну никак не то, что я хотел.
Может не тот хендл окна передается? Дело в том, что эта функция, походу, используется для Alt+Tab (и раньше была недокументированной). Я ее использую в одном проекте. Нареканий никогда небыло.
Здравствуйте, YuriKobets, Вы писали:
YK>Здравствуйте, Eugeny__, Вы писали:
E__>>Почему-то способ работает только при включенной студии(даже если процесс запускать не из студии). Как только студию выгрузить, на одно из приложений переключается нормально, а вот жавовский фрейм заставляет мигать в трее, а это ну никак не то, что я хотел.
YK>Может не тот хендл окна передается? Дело в том, что эта функция, походу, используется для Alt+Tab (и раньше была недокументированной). Я ее использую в одном проекте. Нареканий никогда небыло.
Хендл тот. При запущенной студии, и тем более, в отладке, все работает как надо. Но как только выгрузишь студию — начинает работать неверно. Бред, блин.
Похоже, винда явовское окно как-то по-другому процессит, попробывал сейчас с другим — все ок. Но мне-то нужно показать жавовское, причем не держать в бекграунде студию при этом.
Новости очень смешные. Зря вы не смотрите. Как будто за наркоманами подсматриваешь. Только тетка с погодой в завязке.
There is no such thing as a winnable war.
Здравствуйте, Eugeny__, Вы писали:
E__>Хендл тот. При запущенной студии, и тем более, в отладке, все работает как надо. Но как только выгрузишь студию — начинает работать неверно. Бред, блин. E__>Похоже, винда явовское окно как-то по-другому процессит, попробывал сейчас с другим — все ок. Но мне-то нужно показать жавовское, причем не держать в бекграунде студию при этом.
Может на другой машине попробовать? Может какой-то сторонний софт мешает? Как вариант попробуйте truelaunchbar.com и к ней плугин Windows List. Там как раз эта функция применяется.
Здравствуйте, YuriKobets, Вы писали:
YK>Здравствуйте, Eugeny__, Вы писали:
E__>>Хендл тот. При запущенной студии, и тем более, в отладке, все работает как надо. Но как только выгрузишь студию — начинает работать неверно. Бред, блин. E__>>Похоже, винда явовское окно как-то по-другому процессит, попробывал сейчас с другим — все ок. Но мне-то нужно показать жавовское, причем не держать в бекграунде студию при этом.
YK>Может на другой машине попробовать? Может какой-то сторонний софт мешает?
Да вроде ничего такого не установлено.
YK>Как вариант попробуйте truelaunchbar.com и к ней плугин Windows List. Там как раз эта функция применяется.
Не, мне оно ничем не поможет. Активно окно1. Мне надо по сигналу от сканера штрихкодов поместить данные в буфер обмена, и показать окно2, а потом через несколько секунд — окно1. При этом пользователь ничего сам делать не должен. Оба окна не принадлежат приложению, которое их должно показывать.
Новости очень смешные. Зря вы не смотрите. Как будто за наркоманами подсматриваешь. Только тетка с погодой в завязке.
There is no such thing as a winnable war.
Здравствуйте, Eugeny__, Вы писали:
YK>>Как вариант попробуйте truelaunchbar.com и к ней плугин Windows List. Там как раз эта функция применяется.
E__>Не, мне оно ничем не поможет.
Я не ради рекламы, я просто для того что бы проверить, работает оно или нет. Если работает, (я пробовал какое-то ява окно, но не факт, что оно такое же как Ваше), значит, что-то странное с окном или еще с чем в программе. А код что я использую простой до нельзя:
Здравствуйте, YuriKobets, Вы писали:
YK>Здравствуйте, Eugeny__, Вы писали:
YK>>>Как вариант попробуйте truelaunchbar.com и к ней плугин Windows List. Там как раз эта функция применяется.
E__>>Не, мне оно ничем не поможет.
YK>Я не ради рекламы, я просто для того что бы проверить, работает оно или нет. Если работает, (я пробовал какое-то ява окно, но не факт, что оно такое же как Ваше), значит, что-то странное с окном или еще с чем в программе. А код что я использую простой до нельзя: YK>
YK>SwitchToThisWindow(m_hWnd, TRUE);
YK>
Точно такой же(разве что из шарповского приложения, но не думаю, что это важно). Более того, в отладочном режиме все ок. Ладно, будем копать(но потом, сейчас я под линухом, немного другим занят).
Новости очень смешные. Зря вы не смотрите. Как будто за наркоманами подсматриваешь. Только тетка с погодой в завязке.
There is no such thing as a winnable war.