Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.51 MB
Время: 0.034 c
2-1188901835
Vovka
2007-09-04 14:30
2007.09.30
Прога для выключения компа в определённое времы!


15-1188534374
Slider007
2007-08-31 08:26
2007.09.30
С днем рождения ! 31 августа 2007 пятница


2-1188756366
Bast
2007-09-02 22:06
2007.09.30
Проблема


2-1188891424
НовичеГГх
2007-09-04 11:37
2007.09.30
Как к приложению прикрутить таймер (Планировщик задачь)


15-1188814093
Gydvin
2007-09-03 14:08
2007.09.30
Траблы с makecab.exe





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский