Всем привет.
Кто-нибудь знает, как можно получить id процесса explorer. Если быть точнее, то не именно explorer, а оболочки, активной сейчас (ведь оболочка может быть и другой).
Логичная идея — взять окно десктопа и по нему получить id его процесса. Но проблема — как получить окно десктопа. GetDesktopWindows возврвщает окно, родитель которого csrss.exe. Реальный десктоп оболочки (тот который мы видим на экране), является порожденным от указанного выше, но как его получить, я так и не смог придумать. Может кто что подскажет.
Я думаю, чт стоит в Реестре посмотреть, кто именно является оботочкой? Какой именно ключ это определяет, я не знаю, но думаю что в MSDN это найти не составит труда. После этого надо преьбрать все процессы и найти explorer по эьтому имени файла. Правда со времен Windows 3.1 (чот-то типа Norton Desktop?) я не видал алтернативных оботочек Windows.
Здравствуйте, al, Вы писали:
al>Я думаю, чт стоит в Реестре посмотреть, кто именно является оботочкой? Какой именно ключ это определяет, я не знаю, но думаю что в MSDN это найти не составит труда.
SysListView32 можно найти сразу среди дочерних окна Progman.
Имею скафандр — готов путешествовать!
Re[2]: Как получить ID Explorer
От:
Аноним
Дата:
17.03.05 14:21
Оценка:
Здравствуйте, al, Вы писали:
al>Я думаю, чт стоит в Реестре посмотреть, кто именно является оботочкой? Какой именно ключ это определяет, я не знаю, но думаю что в MSDN это найти не составит труда. После этого надо преьбрать все процессы и найти explorer по эьтому имени файла.
Где имеено это посмотреть я тоже не знаю, но этот вариант считаю менее предпочтительным. Дело в том что в WinXP может быть несколько explorer одновременно загружено (когда несколько пользователей залогинено одновременно). А мне нужен тот, который сейчас на дисплее виден. Поэтому я сразу и подумал получать id через окно, но....
al>Правда со времен Windows 3.1 (чот-то типа Norton Desktop?) я не видал алтернативных оботочек Windows.
Да сколько угодно. Для примера, самые распространенные это Aston и Talisman. Сам я такой ерундой не маюсь, но мало ли кто на чем повернут.
Может еще какие предложения есть? Буду рад любым, так как сам уже вымучился, ничего не получается.
Большое спасибо. Если не смогу найти другой способ, то прийдется воспользоваться этим.
Почему этот способ мне не нравиться я описал ниже (это я там под анонимом написал, забыл залогинится).
RB>Для explorer-а иерархия окон всегда одна и та же. RB> "#32769" (GetDesktopWindow) RB> "Progman" RB> "SHELLDLL_DefView" RB> "SysListView32" RB>SysListView32 можно найти сразу среди дочерних окна Progman.
Это конечно хорошо, но если будет другая оболочка стоять, то и иерархия может быть другой.
А нужно чтоб всегда работало.
RB>Для explorer-а иерархия окон всегда одна и та же.
Где то в MSDN я читал статейку от MS о том, что на имена классов окон следует завязываться в свмом крайнем случае (правдв это было сказано про IE), т.к. они не гарантируют их постоянство в разных версиях. Я конечно понимаю, что они десять раз подумают прежде чем это сделать, но все таки.
Здравствуйте, Аноним, Вы писали:
> Дело в том что в WinXP может быть несколько explorer одновременно загружено (когда несколько пользователей залогинено одновременно).
Перебирайте окна текущего пользователя и смотрите какой процесс их создал
Здравствуйте, al, Вы писали:
al>Перебирайте окна текущего пользователя и смотрите какой процесс их создал
Приблизительно так я и сделал.
Спасибо всем за помощь.
Если кому интересно, то алгоритм получился следующий:
1. Получить из реестра имя процесса текущей оболочки ([HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Shell])
2. Взять окно текущего десктопа (GetDesktopWindows)
3. Пребирать все дочерние окна для десктопа
4. Для каждого дочернего окна получить процесс, породивший его. Если этот процесс совпадает с тем, которое получено в (1), то это и есть процесс оболочки, т.е. то что искал.