Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Программа и интерфейс
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #16  
Старый 23.11.2012, 13:38
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
Радость

вообще explorer это не обычное приложение
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #17  
Старый 23.11.2012, 16:37
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Вообще експлорер по всей видимости в 7 винде при запуске просит уже запущенный експлорер создать еще одно окно (растет потребляемая память открытого експлорера).
А если запускается второй - кто сказал, что именно главный поток создаст окно? Или что он не запускает еще одну копию себя, которую просит открыть окно?
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #18  
Старый 23.11.2012, 17:23
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Интересно ещё, что второй процесс "explorer.exe" закрывается не сразу после закрытия окна ради которого он был открыт, а через некоторое время...
Действительно "Странный Explorer в Windows 7"
Ответить с цитированием
  #19  
Старый 23.11.2012, 19:01
Аватар для SCrat.ORS
SCrat.ORS SCrat.ORS вне форума
Активный
 
Регистрация: 20.02.2007
Адрес: Мой адрес не дом и не улица, мой адрес 0x7С00
Сообщения: 208
Версия Delphi: 2006
Репутация: 884
По умолчанию

Немного добавлю.
Что хотите получить от explorer.exe?, ведь оно используется не только для запуска проводника виндовс, но и так же как shell.
К примеру если в реестре:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
Параметр Shell сделать пустым, то после перезагрузки как не запускай explorer.exe - запустится только проводник, причём сколько угодно раз.
А если параметр Shell=Explorer.exe, то при первом запуске загрузится рабочий стол (shell), а последующие запускают проводник...
__________________
Програмистами не рождаются, ими становятся!
Ответить с цитированием
  #20  
Старый 24.11.2012, 21:02
reqyz reqyz вне форума
Начинающий
 
Регистрация: 13.02.2010
Сообщения: 104
Репутация: 10
По умолчанию

так что же делать, кто нибудь решение подскажет?
Ответить с цитированием
  #21  
Старый 25.11.2012, 13:38
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
Радость

создавай новый рабочий стол без переключения на него и запускай на нем explorer
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #22  
Старый 27.11.2012, 05:42
reqyz reqyz вне форума
Начинающий
 
Регистрация: 13.02.2010
Сообщения: 104
Репутация: 10
По умолчанию

Цитата:
Сообщение от NumLock
создавай новый рабочий стол без переключения на него и запускай на нем explorer
Вы задачу не поняли?) Задача: открыть новое окно эксплорера с папкой которой лежит моя прога и получить хэндл этого окна. Ваш совет чем поможет?
Ответить с цитированием
  #23  
Старый 27.11.2012, 09:34
Аватар для SCrat.ORS
SCrat.ORS SCrat.ORS вне форума
Активный
 
Регистрация: 20.02.2007
Адрес: Мой адрес не дом и не улица, мой адрес 0x7С00
Сообщения: 208
Версия Delphi: 2006
Репутация: 884
По умолчанию

Код:
var
p:string;
h:HWND;
i,i1:integer;
begin
p:=extractfiledir(application.ExeName); //Извлекаем полный путь до папки
h:=0; //Начальный хендл
i1:=0;//стартовая позиция поиска
if ShellExecute(0,'open',PChar(p),nil,nil,SW_SHOWDEFAULT)=42 then begin //открываем папку с ехе
for i := 1 to length(p) do if p[i]='\' then i1:=i; //получаем позицию конечной папки в полном пути
p:=copy(p,i1+1,length(p)-i1); //извлекаем название конечной папки
while h=0 do h:=FindWindow(nil, PChar(p)); //перебираем окна до тех пор, пока не найдем окно с заголовком с названием папки
ShowMessage('Нашлось - '+Inttostr(h));
end;
end;

Собственно вопрос был - почему хендл explorera находился нулевым.
Продолжаем думать.
__________________
Програмистами не рождаются, ими становятся!

Последний раз редактировалось SCrat.ORS, 27.11.2012 в 09:45.
Ответить с цитированием
  #24  
Старый 27.11.2012, 10:21
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Цитата:
Сообщение от reqyz
Ваш совет чем поможет?
тем, что через EnumDesktopWindows дальше найдешь 3 видимых окна: Shell_TrayWnd, CabinetWClass, Progman. CabinetWClass и будет искомым окном.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #25  
Старый 27.11.2012, 17:06
reqyz reqyz вне форума
Начинающий
 
Регистрация: 13.02.2010
Сообщения: 104
Репутация: 10
По умолчанию

Ладно, всем спасибо, решил задачу как извращенец) вот
Код:
    path:=ExtractFilePath(ParamStr(0));
    delete(path,length(path),1);
    name:=ExtractFileName(path);
    with StartInfo do
    begin
      cb := SizeOf(StartInfo);
    end;
    CreateProcessA(nil,PChar('Explorer n/,/select,"'+paramstr(0)+'"'),nil,nil,false,0,nil,nil,StartInfo,ProcInfo);
    //WaitForSingleObject(ProcInfo.hProcess, INFINITE);
    WaitForInputIdle(ProcInfo.hProcess, INFINITE);
    sleep(1000);
    Handle:=0;
    repeat
      Handle:=FindWindowEx(0,Handle,nil,PChar(name));
      GetWindowThreadProcessId(Handle,id);
      pid:=OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False,id);
      SetLength(ExeFile, MAX_PATH);
      if GetModuleBaseNameA(pid, 0, PChar(ExeFile), MAX_PATH) > 0 then
               SetLength(ExeFile, StrLen(PChar(ExeFile)))
    until((lowercase(ExeFile)='explorer.exe')and(IsWindowVisible(Handle)));
    CloseHandle(ProcInfo.hProcess);
    CloseHandle(ProcInfo.hThread);
Ответить с цитированием
  #26  
Старый 27.11.2012, 18:42
robt robt вне форума
Активный
 
Регистрация: 17.02.2011
Сообщения: 298
Репутация: -1806
По умолчанию

а в чем был собственно смысл ?
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 21:25.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter