Форум: "WinAPI";
Текущий архив: 2007.09.30;
Скачать: [xml.tar.bz2];
ВнизКак получить список запущенных приложений из службы? Найти похожие ветки
← →
igornov (2007-03-31 09:11) [0]Hi All!
Есть некий мною написанный сервис. Есть необходимость запускать его без доступа к рабочему столу и при этом видеть
список запущенных приложений, так чтобы можно было читать заголовки любых окон.
Хендлы процессов получить могу. Существует ли способ зная хенл процесса получить заголовки всех его окон. Сразу же напоминаю - сервис не должен иметь доступа к рабочему столу.
Заранее благодарен за ответ.
← →
igornov (2007-03-31 09:42) [1]Уточню вопрос.
Как зная хендл процесса перебрать все его окна из сервиса (который не имеет доступа к рабочему столу)?
← →
Чапаев © (2007-03-31 09:46) [2]Поменяй временно оконную станцию и десктоп сервиса на интерактивные да и получай себе окна. Сервису при этом не нужно быть интерактивным.
← →
igornov (2007-03-31 10:22) [3]
> Поменяй временно оконную станцию и десктоп сервиса на интерактивные
Можно подробнее про изменение оконной станции и десктопа..?
← →
Чапаев © (2007-03-31 10:39) [4]Смотри в справке SetProcessWindowStation(), SetThreadDesktop(). Лучше смотреть в борландовской, там есть хороший примерчик, который в MSDN почему-то отсутствует.
← →
igornov (2007-03-31 13:18) [5]посмотрел...
вот написал такое...(кусок ниже) но почему-то окон не видно при обработке. Как только ставлю доступ к рабочему столу и перезапускаю сервис - всё видно... то есть программа обработки работает правильно, но когда нет доступа к рабочему столу , то окон после выполнения всего внизу не видно.
Что я сделал не так?
....
Desk_old:=GetDesktopWindow;
WinSta_old:=GetProcessWindowStation;
WinSta:= OpenWindowStation ("WinSta0",False,MAXIMUM_ALLOWED);
SetProcessWindowStation(WinSta);
Desk:=OpenDesktop("Default",0,False,MAXIMUM_ALLOWED);
SetThreadDesktop(Desk);
//тут обработка окон
...
SetProcessWindowStation(WinSta_old);
SetThreadDesktop(Desk_old);
CloseWindowStation(winsta);
CloseDesktop(Desk);
← →
Чапаев © (2007-03-31 13:29) [6]> Desk:=OpenDesktop("Default",0,False,MAXIMUM_ALLOWED);
OpenInputDesktop().
Надеюсь, как в примере, вызываешь в самом начале GetDesktopWindow()?
← →
Чапаев © (2007-03-31 13:40) [7]Ах да... Ещё SwitchDesktop() посмотри. Самое главное. ;-)
← →
igornov (2007-03-31 14:13) [8]
> Надеюсь, как в примере, вызываешь в самом начале GetDesktopWindow()?
> Ещё SwitchDesktop()
Да вызываю GetDesktopWindow()...
OpenInputDesktop() писать сразу за
OpenDesktop("Default",0,False,MAXIMUM_ALLOWED)?
а SwitchDesktop() когда писать?
Не могу найти ни одного примера где это всё используется:(
← →
igornov (2007-03-31 14:15) [9]пробовал уже по всякому ... ну не видит этот сервис окон пользователя ни в какую...
← →
Чапаев © (2007-03-31 14:44) [10]> OpenInputDesktop() писать сразу за
> OpenDesktop("Default",0,False,MAXIMUM_ALLOWED)?
Не после, а вместо. ;-)
> а SwitchDesktop() когда писать?
Когда получишь хэндл десктопа, на котором окна.
← →
igornov (2007-03-31 15:01) [11]Не работает:(...(текст внизу)...тут я в форумах встречаю сообщения что в данном случае у сервиса должна быть установлена галка для доступа к рабочему столу... но мне этого не нужно...
...
var
WinSta:HWINSTA;
Desk:HDESK;
begin
GetDesktopWindow();
WinSta:= OpenWindowStation ("WinSta0",False,MAXIMUM_ALLOWED);
SetProcessWindowStation(WinSta);
Desk:=OpenInputDesktop (DF_ALLOWOTHERACCOUNTHOOK,False,MAXIMUM_ALLOWED);
SwitchDesktop(desk);
SetThreadDesktop(Desk);
//обработка окон
CloseWindowStation(winsta);
CloseDesktop(Desk);
end
← →
Чапаев © (2007-03-31 15:56) [12]Только что проверил, всё отлично работает...
GеtDesktopWindow;
SaveWS:=GetProcеssWindowStation;
SaveDesk:=GetThrеadDеsktop(GetCurrentThreadId);
NewWS:=OpenWindowStatiоn("WinSta0",False,MAXIMUM_ALLOWED);
SуtProcessWindowStation(NewWS);
NewDesk:=OpenInputDesktоp(0,False,MAXIMUM_ALLOWЕD);
SetThrеadDesktop(NewDesk);
SwitchDesktop(NewDesk);
EnumWindows(@EnumWindоwsProc,0); //тут вся осмысленная работа
SwitchDеsktоp(SaveDesk);
SetThreadDesktop(SaveDesk);
SetProcessWindowStation(SaveWS);
CloseDеsktop(NewDesk);
CloseWindоwStation(NewWS);
← →
igornov (2007-03-31 16:50) [13]Всё это же попробовал у себя и в функции EnumWindоwsProc сделал запись лога - видит только свой рабочий стол (невидимый)...Не переключается на текщий.
ставлю галку на доступ к рабочему столу и перезапускаю - видит всё...
← →
Чапаев © (2007-03-31 17:19) [14]Ну тогда не могу порекомендовать ничего, кроме как батюшку позвать освятить комп. У меня приведенный код из неинтерактивного сервиса успешно перечисляет все окна.
← →
igornov (2007-04-02 09:22) [15]
> У меня приведенный код из неинтерактивного сервиса
Именно этот код работает?
> SуtProcessWindowStation(NewWS);
Тут то ведь неправильно, то есть скорее всего то что тут выше (код) набрано вручную на скорую руку и не проверялось на самом деле...Или я не прав?
← →
Чапаев © (2007-04-02 09:35) [16]> Тут то ведь неправильно, то есть скорее всего то что тут
> выше (код) набрано вручную на скорую руку
;-) По правде говоря, я в целях защиты от копипаста некоторые латинские "е" и "о" заменил на кирилличные. В одном месте промахнулся. Бывает. %-)
Вручную набран только момент про Close*().
← →
igornov (2007-04-02 09:54) [17]:) ясно:) извиняюсь
Не получается у меня... может указанная смена рабочей станции и десктопа имеет какие-либо ограничения на использование? Логи показывают что сервис видит только окна своего десктопа и ничего больше.
← →
Чапаев © (2007-04-02 10:16) [18]А какая операционка? У меня XP SP2.
← →
igornov (2007-04-02 12:06) [19]а у меня W2k
← →
igornov (2007-04-02 12:06) [20]sp4
← →
igornov (2007-04-03 11:03) [21]В общем получилось!!!:) код тот же но нужно вместо
EnumWindows(@EnumWindоwsProc,0);
использовать
EnumDesktopWindows(hd, @EnumDesktopWindowsProc, 0).
Тогда работает на ура.
Благодарю за помощь!!!
← →
igornov (2007-04-03 11:14) [22]точнее
EnumDesktopWindows(NewDesk, @EnumDesktopWindowsProc, 0).
← →
Чапаев © (2007-04-03 14:50) [23]Тогда и пляски с изменением рабочей станции и десктопа не нужны, наверное. Изменять десктоп точно не нужно. OpenInputDesktop(), EnumDesktopWindiws(), CloseDesktop().
← →
Eraser © (2007-04-04 23:52) [24]> igornov
> В общем получилось!!!:) код тот же но нужно вместо
> EnumWindows(@EnumWindоwsProc,0);
> использовать
> EnumDesktopWindows(hd, @EnumDesktopWindowsProc, 0).
данный код не поддерживает работу при нескольких терминальных сессиях, т.о. он не будет работыть в XP если пользователь не в 0 терм. сессии.. в Висте работать не будет вообще.
Под "не будет работать" я имею ввиду то, что будут видны окна в windowStation"ах только 0 терм. сессии, что вас вряд ли интересует.
Меняй архитектуру пока не поздно.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2007.09.30;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.04 c