Как узнать путь открытого окна?

  • Автор темы Sandrix
  • Дата начала
Статус
Закрыто для дальнейших ответов.
S

Sandrix

#1
привет :blink:

сори за вторжение но очень нужна помощь.
надо узнать путь открытого окна explorer–а, точнее путь к папке которая открыта в данный момент. я выяснил что для этого используется библиотека Active Accessibility но дальше не как... может статья есть?(я не нашел) или еще что не будь? 2 месяца искал. HELP PLS ;)
 

vital

Больной Компом Детектед
29.01.2006
2 432
33
#2
ух ты.. Я вижу дво способа но оба весьма идиотски и сложны..

Адля чего такое понадобилось, возможно есть способ обойтись без этого?
 

vital

Больной Компом Детектед
29.01.2006
2 432
33
#3
в общем виде...
нуна найти хендл експлорера
зная хендл плорера найти EDIT (используя findwindowex)
в котором показывается текущий путь(тот который чуть ниже панели с кнопками)
и потом Sendmessage с WM_GETTEXT на хендл EDIT'a..

пс.
ну и глупость я наверно написал..
 
Z

zubr

#4
Более универсальный способ - это перехват функции ZwCreateFile, таким образом можно определить путь к открывающемуся файлу, а не только папки, любой программой, а не только explorer.
Что касается explorer, то тут можно через шеллекстеншион, в примерах к Delphi (по крайней мере до Delphi7) есть пример ...Demos\ActiveX\ShellExt
 
S

Sandrix

#5
доброго времени суток :)

vital
адрес бар искать не надо. там не всегда полный путь виден :angry: зависит от установок пользователя.

zubr

ZwCreateFile тож нелзя because:
мнеб надо узнать какой файл под курсором находится... метод пока Что такой:
1. узнаю текст под курсором. (сделал)
2. узнаю находится ли под курсором System32 ListView(or FolderView), если да, то текст под курсором это имя файла. (сделал)
3. дальше нужен фолдер а то файлов с таким именем может быть 8969869... вот тут то и проблема... если какой то другой метод есть - буду рад выслушать :)

p.s. sorry for my bad Russian.
 
Z

zubr

#6
ZwCreateFile тож нелзя because:
мнеб надо узнать какой файл под курсором находится... метод пока Что такой:
1. узнаю текст под курсором. (сделал)
2. узнаю находится ли под курсором System32 ListView(or FolderView), если да, то текст под курсором это имя файла. (сделал)
3. дальше нужен фолдер а то файлов с таким именем может быть 8969869... вот тут то и проблема... если какой то другой метод есть - буду рад выслушать
Ну так вы же будете знать какой последний каталог был открыт экземпляром explorer, просто запоминайте каталоги для каждого открытого экземпляра (по хендлу окна), а затем проверяйте есть ли файл под курсором для активного экземпляра explorer в данном каталоге.
 
S

Sandrix

#7
otkuda ja budu eto znat'? :) mojet ja ne ponel 4to ne bud'? ob'esnite pojaluista. :) kak uznat kakoi folder otkrilsa poslednim? a esli user v tomje okne pereidet na drugoi folder? ili kakajata programma eto sdelaet? ili on v ruchnuju zapishet adress foldera v adress bar? :angry:
 
Z

zubr

#8
otkuda ja budu eto znat'? mojet ja ne ponel 4to ne bud'? ob'esnite pojaluista. kak uznat kakoi folder otkrilsa poslednim? a esli user v tomje okne pereidet na drugoi folder? ili kakajata programma eto sdelaet? ili on v ruchnuju zapishet adress foldera v adress bar?
Можно даже с ZwCreateFile не заморачиваться, как я уже писал в посте выше, можно использовать шеллекстеншион, пример есть в Delphi. Смысл в том, что когда юзер открывает каталог, срабатывает хук, в обработчике которого можно определить путь к каталогу.
Последовательность действий такова:
1. Как только сработал хук, то есть юзер в эксплорере открыл какой то каталог, программа определяет хендл экземпляра эксплорера (GetForegroundWindow) и путь к каталогу.
2. Запоминает данные по хендлу и пути в массиве или списке, естественно проверив на наличие хендла в списке.
3. При наведении курсора на какой нибудь файл в активном окне эксплорера сопостовляем хендл окна с путем к каталогу (прокрутив наш список), проверяем есть ли файл в данном каталоге.
4. Отслеживаем через хук закрытия окон - если закрылось наше окно, которое в списке - удаляем данные по нему из списка.
 
S

Sandrix

#9
Для: zubr

genialno, i prosto :) ogromneshee spasibo za takoi vrazumitel'nij otvet :( paidu razbiratsa..

p.s. ne zakrivaite ety temy, mojet ya ne razberus vchemto :)
 
P

Peter123

#10
Может способ и идиотский, но предложу.

А если воспользоваться Drag'n'Drop? Послать нажатие левой кнопой, изменить координаты курсора на свое окно(может быть размером в пиксел), отпустить мышу. По идее, Експлорер должен отдать полный путь файла сам.
Не судите строго. :)
 
S

Sandrix

#11
Для: Peter123

метод наверно будет работать... но он сам по себе не универсален(в смысле что надо следить за координатами окна explorer–а) и очень медленный :)

p.s. извините конечно за наглость... но в том примере сидит ком object, который я не как не смог присобачить к моему проекту :) и я не понял как получать этот хук с путем к фолдеру :( ну узнал я все хэндлы окон эксплорера а путь не как... может подкинте example кода? :( знаю это уже слишком но не как не выходит :ph34r:
 
S

Sandrix

#13
вот тут накопал пару ф-ий
FindNextChangeNotification
FMExtensionProc


может в них есть толк какой-нибудь? ну помогитеже :) разве вам не интересно? :)
 
Статус
Закрыто для дальнейших ответов.