![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как получить список запущенных приложений из службы? [D5, Win2k]
igornov © (2007-03-31 09:11:00)Hi All!
Есть некий мною написанный сервис. Есть необходимость запускать его без доступа к рабочему столу и при этом видеть
список запущенных приложений, так чтобы можно было читать заголовки любых окон.
Хендлы процессов получить могу. Существует ли способ зная хенл процесса получить заголовки всех его окон. Сразу же напоминаю - сервис не должен иметь доступа к рабочему столу.
Заранее благодарен за ответ.
Eraser (2007-04-04 23:52:00) [1]> igornov
> В общем получилось!!!:) код тот же но нужно вместо
> EnumWindows(@EnumWindоwsProc,0);
> использовать
> EnumDesktopWindows(hd, @EnumDesktopWindowsProc, 0).
данный код не поддерживает работу при нескольких терминальных сессиях, т.о. он не будет работыть в XP если пользователь не в 0 терм. сессии.. в Висте работать не будет вообще.
Под "не будет работать" я имею ввиду то, что будут видны окна в windowStation'ах только 0 терм. сессии, что вас вряд ли интересует.
Меняй архитектуру пока не поздно.
Чапаев (2007-04-03 14:50:00) [2]Тогда и пляски с изменением рабочей станции и десктопа не нужны, наверное. Изменять десктоп точно не нужно. OpenInputDesktop(), EnumDesktopWindiws(), CloseDesktop().
igornov (2007-04-03 11:14:00) [3]точнее
EnumDesktopWindows( NewDesk, @EnumDesktopWindowsProc, 0).
igornov (2007-04-03 11:03:00) [4]В общем получилось!!!:) код тот же но нужно вместо
EnumWindows(@EnumWindоwsProc,0);
использовать
EnumDesktopWindows(hd, @EnumDesktopWindowsProc, 0).
Тогда работает на ура.
Благодарю за помощь!!!
igornov (2007-04-02 12:06:00) [5]sp4
igornov (2007-04-02 12:06:00) [6]а у меня W2k
Чапаев (2007-04-02 10:16:00) [7]А какая операционка? У меня XP SP2.
igornov (2007-04-02 09:54:00) [8]:) ясно:) извиняюсь
Не получается у меня... может указанная смена рабочей станции и десктопа имеет какие-либо ограничения на использование? Логи показывают что сервис видит только окна своего десктопа и ничего больше.
Чапаев (2007-04-02 09:35:00) [9]> Тут то ведь неправильно, то есть скорее всего то что тут
> выше (код) набрано вручную на скорую руку
;-) По правде говоря, я в целях защиты от копипаста некоторые латинские "е" и "о" заменил на кирилличные. В одном месте промахнулся. Бывает. %-)
Вручную набран только момент про Close*().
igornov (2007-04-02 09:22:00) [10]
> У меня приведенный код из неинтерактивного сервиса
Именно этот код работает?
> SуtProcessWindowStation(NewWS);
Тут то ведь неправильно, то есть скорее всего то что тут выше (код) набрано вручную на скорую руку и не проверялось на самом деле...Или я не прав?
Чапаев (2007-03-31 17:19:00) [11]Ну тогда не могу порекомендовать ничего, кроме как батюшку позвать освятить комп. У меня приведенный код из неинтерактивного сервиса успешно перечисляет все окна.
igornov (2007-03-31 16:50:00) [12]Всё это же попробовал у себя и в функции EnumWindоwsProc сделал запись лога - видит только свой рабочий стол (невидимый)...Не переключается на текщий.
ставлю галку на доступ к рабочему столу и перезапускаю - видит всё...
Чапаев (2007-03-31 15:56:00) [13]Только что проверил, всё отлично работает...
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 15:01:00) [14]Не работает:(...(текст внизу)...тут я в форумах встречаю сообщения что в данном случае у сервиса должна быть установлена галка для доступа к рабочему столу... но мне этого не нужно...
...
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 14:44:00) [15]> OpenInputDesktop() писать сразу за
> OpenDesktop('Default',0,False,MAXIMUM_ALLOWED)?
Не после, а вместо. ;-)
> а SwitchDesktop() когда писать?
Когда получишь хэндл десктопа, на котором окна.
igornov (2007-03-31 14:15:00) [16]пробовал уже по всякому ... ну не видит этот сервис окон пользователя ни в какую...
igornov (2007-03-31 14:13:00) [17]
> Надеюсь, как в примере, вызываешь в самом начале GetDesktopWindow()?
> Ещё SwitchDesktop()
Да вызываю GetDesktopWindow()...
OpenInputDesktop() писать сразу за
OpenDesktop('Default',0,False,MAXIMUM_ALLOWED)?
а SwitchDesktop() когда писать?
Не могу найти ни одного примера где это всё используется:(
Чапаев (2007-03-31 13:40:00) [18]Ах да... Ещё SwitchDesktop() посмотри. Самое главное. ;-)
Чапаев (2007-03-31 13:29:00) [19]> Desk:=OpenDesktop('Default',0,False,MAXIMUM_ALLOWED);
OpenInputDesktop().
Надеюсь, как в примере, вызываешь в самом начале GetDesktopWindow()?
igornov (2007-03-31 13:18:00) [20]посмотрел...
вот написал такое...(кусок ниже) но почему-то окон не видно при обработке. Как только ставлю доступ к рабочему столу и перезапускаю сервис - всё видно... то есть программа обработки работает правильно, но когда нет доступа к рабочему столу , то окон после выполнения всего внизу не видно.
Что я сделал не так?
....
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);