Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Делфи _ Сообщения проводника, API

Автор: Unconnected 6.08.2010 0:53

Привет всем.

Возникло несколько вопросов, когда общался с windows-проводником. Первое - когда я открываю Мой компьютер, то это же окно? В таком случае, какой заголовок оно имеет, как найти хэндл? Если в XP, то обычно в какую папку зайдёшь, такой заголовок и будет. И то, может отображаться полный путь к папке, а может и просто имя папки. В win7 же вообще в "Моём компьютере" никаких заголовков не наблюдается. Это непонятная вариативность. Есть ли универсальный способ найти окно проводника (если заходить с "Моего компьютера" или с "Пуск->Проводник"), чтобы можно было в том числе определить, в какой директории этот проводник находится?

Автор: volvo 6.08.2010 1:18

Цитата
Есть ли универсальный способ найти окно проводника
Есть, разумеется, http://msdn.microsoft.com/en-us/library/cc836570%28VS.85%29.aspx и http://msdn.microsoft.com/en-us/library/aa752127%28VS.85%29.aspx на что придумали?

  Explorer := CoShellWindows.Create;
for I := 0 to Explorer.Count - 1 do
Memo1.Lines.Add((Explorer.Item(I) as IWebbrowser2).LocationUrl);

Может понадобиться подключить модуль SHDocVw.

А, да... Explorer - типа IShellWindows, если что smile.gif

А вообще, искать окно эксплорера можно так: FindWindow('ExploreWClass', nil). И под XP можно взять название текущей папки через GetWindowText. Но лучше все-таки штатными средствами, чтоб независимо от версии Windows...

Автор: Unconnected 6.08.2010 1:26

Цитата
А вообще, искать окно эксплорера можно так: FindWindow('ExploreWClass', nil). И под XP можно взять название текущей папки через GetWindowText. Но лучше все-таки штатными средствами, чтоб независимо от версии Windows...


Ага, значит, есть разница в этом в разных windows. Тогда, можно находить через FindWindow, а папку брать не с GetWindowText, а искать нужный эдит, он-то и в севене тоже есть. Ибо сильно жирный этот SHDocVw..

Автор: volvo 6.08.2010 1:32

Цитата
он-то и в севене тоже есть
Есть-то он есть, да вот ты можешь гарантировать, что находятся адресные строки (там не эдиты, а ComboBoxEx32) на одном уровне и в XP и в Win7? А если нет, тогда что делать?опять проверять, какая ОС, и далее условиями? Ну, делай, как знаешь. Только сначала попробуй с SHDocVw, а потом - чтоб отработало на WinXP/Vista/Win7 без него. И сравни результаты. И время разработки заодно...

Автор: Unconnected 6.08.2010 1:48

Цитата
Ну, делай, как знаешь. Только сначала попробуй с SHDocVw, а потом - чтоб отработало на WinXP/Vista/Win7 без него. И сравни результаты. И время разработки заодно...


Намёк понял) Я, наверное, сделаю вариант только для XP. Знаю, что так делать нехорошо, но этот момент не сильно критичен, размер важнее.

Кстати, кажется, для XP не ищет..

var h:hwnd;
p:pchar;
begin
h:=FindWindow('ExploreWClass', nil);
if h<>0 then begin
getwindowtext(h,p,255);
showmessage(p);
...
end;




До showmessage не доходит. Окошко проводника в момент поиска открыто.

Автор: volvo 6.08.2010 2:07

Ага. Это мой глюк. В XP такая фигня: если окно эксплорера открыто правым кликом по MyComputer и выбором пункта меню Explore - то тогда имя класса = ExploreWClass. Если же правый клик по MyComputer + меню Open - то имя класса - CabinetWClass. Так что вот тебе еще один довод в пользу стандартных средств smile.gif.

Автор: Client 6.08.2010 2:23

спасибо за информацию smile.gif //это я так, немного влез в тему smile.gif

Автор: Unconnected 6.08.2010 2:42

Присоединяюсь к Client'у, давно интересовала эта тема smile.gif Ещё небольшой вопрос, я криво вызываю getwindowtext, что ли.. Когда делал с pchar, в буфере были кракозябры, а сейчас вообще ничего:

var h:hwnd;
ps:string;
begin
h:=FindWindow('ExploreWClass', nil);
if h=0 then h:=findwindow('CabinetWClass',nil);
if h<>0 then begin
getwindowtext(h,pchar(ps),255);
showmessage(ps);
...
end;
end;

Автор: volvo 6.08.2010 2:51

Цитата
я криво вызываю getwindowtext, что ли
Память надо выделять под тот текст, который будет читаться. А String этого не делает. Это динамическая строка...
procedure TForm1.Button1Click(Sender: TObject);
var
h: hwnd;
p: array[0 .. pred(MAX_PATH)] of char;
begin
h := FindWindow('CabinetWClass', nil);
if h <> 0 then
begin
getwindowtext(h, p, max_path);
showmessage(p);
end
else showmessage('cannot find explorer window');
end;

Все нормально отображается. Даже если в названии папки - кириллица...

Автор: Client 6.08.2010 2:55

с PChar у меня отработало...

Автор: Unconnected 6.08.2010 3:34

volvo, спасибо, сделал что хотел. Я, кстати, вроде раньше тоже с pchar делал и работало..)