Помощь - Поиск - Пользователи - Календарь
Полная версия: Сообщения проводника, API
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Делфи
Unconnected
Привет всем.

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

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


Ага, значит, есть разница в этом в разных windows. Тогда, можно находить через FindWindow, а папку брать не с GetWindowText, а искать нужный эдит, он-то и в севене тоже есть. Ибо сильно жирный этот SHDocVw..
volvo
Цитата
он-то и в севене тоже есть
Есть-то он есть, да вот ты можешь гарантировать, что находятся адресные строки (там не эдиты, а ComboBoxEx32) на одном уровне и в XP и в Win7? А если нет, тогда что делать?опять проверять, какая ОС, и далее условиями? Ну, делай, как знаешь. Только сначала попробуй с SHDocVw, а потом - чтоб отработало на WinXP/Vista/Win7 без него. И сравни результаты. И время разработки заодно...
Unconnected
Цитата
Ну, делай, как знаешь. Только сначала попробуй с 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
Ага. Это мой глюк. В XP такая фигня: если окно эксплорера открыто правым кликом по MyComputer и выбором пункта меню Explore - то тогда имя класса = ExploreWClass. Если же правый клик по MyComputer + меню Open - то имя класса - CabinetWClass. Так что вот тебе еще один довод в пользу стандартных средств smile.gif.
Client
спасибо за информацию smile.gif //это я так, немного влез в тему smile.gif
Unconnected
Присоединяюсь к 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
Цитата
я криво вызываю 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
с PChar у меня отработало...
Unconnected
volvo, спасибо, сделал что хотел. Я, кстати, вроде раньше тоже с pchar делал и работало..)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.