| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > Активировать окно приложения (запуск из сервиса) |
| Автор: InvalidProperty 13.11.2009, 16:35 | ||
| Привет, возникла проблема: имеется сервис, который в ответ на запрос клиента, должен запустить процесс от активного текущего пользователя (CreateProcessAsUser). Окно созданного процесса должно стать активным. В XP все работает отлично, т.к. первое созданное окно становится активным. В Viste наблюдается другое поведение: окно создается, но не становится активным. Что можно сделать, чтобы активировать окно? Вот код со стороны сервиса, который создает процесс:
test.exe может быть любым приложением, в рамках которого создается окно |
| Автор: BEOWOLF 13.11.2009, 17:19 |
| Можно через BringWindowToTop вывести... Найти окно через FindWindow, если имя класса или заголовок - не известны, то тогда через EnumWindows пролистать главные окна и определить через GetWindowThreadProcessId нужное. |
| Автор: InvalidProperty 13.11.2009, 17:56 | ||
| ключевое словосочетание: сервис под вистой. Под вистой findwindow для сервиса не работает. Если вызывать BringWindowToTop из test.exe, то окно также не будет активным. Вот код, который я пробовал для test.exe. Ни одна из функций в потоке не делает активным окно:
|
| Автор: InvalidProperty 20.11.2009, 18:58 | ||
| Товарищи, вопрос решен. Решение следующее: Сервис создает процесс как описано в первом посте, после чего только что созданный процесс производит следующие операции:
, где g_hwnd - Handle главного окна созданного процесса т.о. главное окно только что созданного процесса становится активным. Примечание: процесс, чье окно сейчас активно должен быть запущен с правами меньшими, либо равными правам создаваемого процесса. |
| Автор: InvalidProperty 25.11.2009, 16:47 |
| что странно, если текущим активным окном, является окно командной строки, то переключение активного окна не происходит, а AttachThreadInput завершается с ошибкой 87 :( . Это очень печалит, но меня пока устраивает вариант и без этого, так что, если кто-нибудь найдет решение для окна командной строки, буду очень признателен |
| Автор: dream2work 9.12.2009, 19:53 |
| StartupInfo.lpDesktop = null; тода окно создастся на рабоем столе юзера чей токен указан в CreateProcessAsUser |
| Автор: InvalidProperty 14.12.2009, 10:33 | ||
это MSDN. Откуда у тебя информация о нулевом десктопе? |