![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| InvalidProperty |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 356 Регистрация: 31.10.2007 Где: Россия, Казань Репутация: 1 Всего: 9 |
Привет,
возникла проблема: имеется сервис, который в ответ на запрос клиента, должен запустить процесс от активного текущего пользователя (CreateProcessAsUser). Окно созданного процесса должно стать активным. В XP все работает отлично, т.к. первое созданное окно становится активным. В Viste наблюдается другое поведение: окно создается, но не становится активным. Что можно сделать, чтобы активировать окно? Вот код со стороны сервиса, который создает процесс:
test.exe может быть любым приложением, в рамках которого создается окно Это сообщение отредактировал(а) InvalidProperty - 13.11.2009, 16:36 -------------------- dd if=$0 of=$0 bs=1 count=76 seek=`du -b $0 | awk {'print $1'}` 2>/dev/null dd if=$0 of=$0 bs=1 count=67 conv=notrunc oflag=append 2>/dev/null echo $0 >> $0 |
|||
|
||||
| BEOWOLF |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 47 Регистрация: 24.8.2007 Репутация: 1 Всего: 2 |
Можно через BringWindowToTop вывести...
Найти окно через FindWindow, если имя класса или заголовок - не известны, то тогда через EnumWindows пролистать главные окна и определить через GetWindowThreadProcessId нужное. |
|||
|
||||
| InvalidProperty |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 356 Регистрация: 31.10.2007 Где: Россия, Казань Репутация: 1 Всего: 9 |
ключевое словосочетание: сервис под вистой. Под вистой findwindow для сервиса не работает.
Если вызывать BringWindowToTop из test.exe, то окно также не будет активным. Вот код, который я пробовал для test.exe. Ни одна из функций в потоке не делает активным окно:
-------------------- dd if=$0 of=$0 bs=1 count=76 seek=`du -b $0 | awk {'print $1'}` 2>/dev/null dd if=$0 of=$0 bs=1 count=67 conv=notrunc oflag=append 2>/dev/null echo $0 >> $0 |
|||
|
||||
| InvalidProperty |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 356 Регистрация: 31.10.2007 Где: Россия, Казань Репутация: 1 Всего: 9 |
Товарищи, вопрос решен.
Решение следующее: Сервис создает процесс как описано в первом посте, после чего только что созданный процесс производит следующие операции:
, где g_hwnd - Handle главного окна созданного процесса т.о. главное окно только что созданного процесса становится активным. Примечание: процесс, чье окно сейчас активно должен быть запущен с правами меньшими, либо равными правам создаваемого процесса. Это сообщение отредактировал(а) InvalidProperty - 20.11.2009, 18:59 -------------------- dd if=$0 of=$0 bs=1 count=76 seek=`du -b $0 | awk {'print $1'}` 2>/dev/null dd if=$0 of=$0 bs=1 count=67 conv=notrunc oflag=append 2>/dev/null echo $0 >> $0 |
|||
|
||||
| InvalidProperty |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 356 Регистрация: 31.10.2007 Где: Россия, Казань Репутация: 1 Всего: 9 |
что странно, если текущим активным окном, является окно командной строки, то переключение активного окна не происходит, а AttachThreadInput завершается с ошибкой 87 :( . Это очень печалит, но меня пока устраивает вариант и без этого, так что, если кто-нибудь найдет решение для окна командной строки, буду очень признателен
-------------------- dd if=$0 of=$0 bs=1 count=76 seek=`du -b $0 | awk {'print $1'}` 2>/dev/null dd if=$0 of=$0 bs=1 count=67 conv=notrunc oflag=append 2>/dev/null echo $0 >> $0 |
|||
|
||||
| dream2work |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 7.12.2009 Репутация: нет Всего: нет |
StartupInfo.lpDesktop = null;
тода окно создастся на рабоем столе юзера чей токен указан в CreateProcessAsUser |
|||
|
||||
| InvalidProperty |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 356 Регистрация: 31.10.2007 Где: Россия, Казань Репутация: 1 Всего: 9 |
это MSDN. Откуда у тебя информация о нулевом десктопе? -------------------- dd if=$0 of=$0 bs=1 count=76 seek=`du -b $0 | awk {'print $1'}` 2>/dev/null dd if=$0 of=$0 bs=1 count=67 conv=notrunc oflag=append 2>/dev/null echo $0 >> $0 |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |