![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#16
|
||||
|
||||
|
вообще explorer это не обычное приложение
|
|
#17
|
||||
|
||||
|
Вообще експлорер по всей видимости в 7 винде при запуске просит уже запущенный експлорер создать еще одно окно (растет потребляемая память открытого експлорера).
А если запускается второй - кто сказал, что именно главный поток создаст окно? Или что он не запускает еще одну копию себя, которую просит открыть окно? |
|
#18
|
||||
|
||||
|
Интересно ещё, что второй процесс "explorer.exe" закрывается не сразу после закрытия окна ради которого он был открыт, а через некоторое время...
Действительно "Странный Explorer в Windows 7" ![]() |
|
#19
|
||||
|
||||
|
Немного добавлю.
Что хотите получить от explorer.exe?, ведь оно используется не только для запуска проводника виндовс, но и так же как shell. К примеру если в реестре: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon Параметр Shell сделать пустым, то после перезагрузки как не запускай explorer.exe - запустится только проводник, причём сколько угодно раз. А если параметр Shell=Explorer.exe, то при первом запуске загрузится рабочий стол (shell), а последующие запускают проводник... |
|
#20
|
|||
|
|||
|
так что же делать, кто нибудь решение подскажет?
|
|
#21
|
||||
|
||||
|
создавай новый рабочий стол без переключения на него и запускай на нем explorer
|
|
#22
|
|||
|
|||
|
Цитата:
|
|
#23
|
||||
|
||||
|
Код:
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
|
||||
|
||||
|
Цитата:
|
|
#25
|
|||
|
|||
|
Ладно, всем спасибо, решил задачу как извращенец) вот
Код:
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
|
|||
|
|||
|
а в чем был собственно смысл ?
|