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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 23.11.2012, 11:17
reqyz reqyz вне форума
Начинающий
 
Регистрация: 13.02.2010
Сообщения: 104
Репутация: 10
Вопрос Странный Explorer в Windows 7

Задача казалась бы очень лёгкая, но столкнулся с необычным глюком. Нужно всего лишь запустить процесс Проводника и получить Хэндл его главной формы.

Делаю так:
Код:
var
  Handl:HWND=0;

function EnumProc(h:HWND; lParam:DWord):boolean; stdcall;
begin
 handl:=h;
 Result:=handl=0;
end;

var
  StartInfo: TStartupInfo;
  ProcInfo: TProcessInformation;
begin
  with StartInfo do
  begin
    cb := SizeOf(StartInfo);
    {dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
    StartInfo.wShowWindow:=SW_show;//hide;
    }
  end;
  CreateProcessA(nil,{PChar('Explorer n/,/select,"'+paramstr(0)+'"')}'Explorer.exe',nil,nil,false,0,nil,nil,StartInfo,ProcInfo);


  //WaitForSingleObject(ProcInfo.hProcess, INFINITE);
  WaitForInputIdle(ProcInfo.hProcess, INFINITE);
  EnumThreadWindows(ProcInfo.dwThreadId,@EnumProc,0);
  CloseHandle(ProcInfo.hProcess);
  CloseHandle(ProcInfo.hThread);


end.
в результате в хэндл получаю ноль, хотя для блокнота то же самое спокойно работает

Думал что может для проводника не так с окнами что либо, потестил через таймер:

Код:
procedure TForm1.Timer1Timer(Sender: TObject);
var
  a:TPoint;
begin
  GetCursorPos(a);
  Caption:=inttostr(WindowFromPoint(a));
end;
так работает.

Внимание, Вопрос: что не так в первом коде?

ну и почему для блокнота и др работает, EnumThreadWindows и EnumWindows для проводника ничего не находят, но ведь окно есть, я же нашёл его... спасите мой глюк)
Ответить с цитированием
  #2  
Старый 23.11.2012, 11:20
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от reqyz
Внимание, Вопрос: что не так в первом коде?

ну и почему для блокнота и др работает, EnumThreadWindows и EnumWindows для проводника ничего не находят, но ведь окно есть, я же нашёл его... спасите мой глюк)
Попробуй приложение от имени администратора запустить.

UPD.
Кстати, а эксплорер хоть запускается? Он же завершается, если обнаруживает что одна его копия уже запущена.

Последний раз редактировалось poli-smen, 23.11.2012 в 11:23.
Ответить с цитированием
  #3  
Старый 23.11.2012, 11:24
reqyz reqyz вне форума
Начинающий
 
Регистрация: 13.02.2010
Сообщения: 104
Репутация: 10
По умолчанию

так я с одмина сижу, да и если через WindowFromPoint(a) работает, почему так не хочет?
Ответить с цитированием
  #4  
Старый 23.11.2012, 11:26
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от reqyz
так я с одмина сижу, да и если через WindowFromPoint(a) работает, почему так не хочет?
Я там выше добавил примечание:
Кстати, а эксплорер хоть запускается? Он же завершается, если обнаруживает что одна его копия уже запущена.
Ответить с цитированием
  #5  
Старый 23.11.2012, 11:27
reqyz reqyz вне форума
Начинающий
 
Регистрация: 13.02.2010
Сообщения: 104
Репутация: 10
По умолчанию

Цитата:
Сообщение от poli-smen
П
Кстати, а эксплорер хоть запускается? Он же завершается, если обнаруживает что одна его копия уже запущена.
эксплорер запускается, когда это он в 7-ке завершался? хоть 50 версий в процессах будет его, для каждой папки и для стола свой)

да, запускается нормально и никуда не исчезает, прямо сейчас на него смотрю, и через енум хэндл 0, а через наведение, находит( блин..
Ответить с цитированием
  #6  
Старый 23.11.2012, 11:32
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от reqyz
эксплорер запускается, когда это он в 7-ке завершался? хоть 50 версий в процессах будет его, для каждой папки и для стола свой)

да, запускается нормально и никуда не исчезает, прямо сейчас на него смотрю, и через енум хэндл 0, а через наведение, находит( блин..
Вот я только что запустил под Win7 ещё один эксплорер, а у меня в процессах как висел, так и висит один процесс "explorer.exe"
Ответить с цитированием
  #7  
Старый 23.11.2012, 11:36
reqyz reqyz вне форума
Начинающий
 
Регистрация: 13.02.2010
Сообщения: 104
Репутация: 10
По умолчанию

Цитата:
Сообщение от poli-smen
Вот я только что запустил под Win7 ещё один эксплорер, а у меня в процессах как висел, так и висит один процесс "explorer.exe"
запустите с таким параметром PChar('Explorer n/,/select,"'+paramstr(0)+'"') тогда будет несколько

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

EnumWindows находит CabinetWClass. и даже можно до SysListView32 добраться
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #9  
Старый 23.11.2012, 11:52
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от reqyz
запустите с таким параметром PChar('Explorer n/,/select,"'+paramstr(0)+'"') тогда будет несколько
Нет. Всё равно в процессах висит только один "explorer.exe". Тот который висит в процессах имеет PID (ИД процесса) равный "3916". А если я в программе после запуска делаю так:
Код:
Caption:=IntToStr(ProcInfo.dwProcessId);
то в заголовке формы появляется PID равный 195120, хотя в процессах такого нет - значит он запустился и сразу закрылся.

А ты вообще как определяешь что у тебя запущено несколько процессов "explorer.exe". Что-то помоему врёшь ты мне.
Ответить с цитированием
  #10  
Старый 23.11.2012, 12:02
reqyz reqyz вне форума
Начинающий
 
Регистрация: 13.02.2010
Сообщения: 104
Репутация: 10
По умолчанию

у меня всё работает, эксплорер открывает папку с выделенным файлом программы, но хэндл не находит, хотя в любых других программах в том же блокноте всё ок
Изображения
Тип файла: jpg 11111111.jpg (64.3 Кбайт, 7 просмотров)
Ответить с цитированием
  #11  
Старый 23.11.2012, 12:06
reqyz reqyz вне форума
Начинающий
 
Регистрация: 13.02.2010
Сообщения: 104
Репутация: 10
По умолчанию

Цитата:
Сообщение от NumLock
EnumWindows находит CabinetWClass. и даже можно до SysListView32 добраться
EnumWindows применял, сравнивая с ид процесса, и не находит ни одного окна(
Ответить с цитированием
  #12  
Старый 23.11.2012, 12:26
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Всё. Получилось запустить ещё один эксплорер твоим способом, я просто не туда скопировал в прошлый раз.
Только вот в диспетчере задач он запускается с PID=195008, а у меня в заголовке формы написано "194208". Т.е. хоть и запустился, но явно не тот который я запускал.
Ответить с цитированием
  #13  
Старый 23.11.2012, 12:43
reqyz reqyz вне форума
Начинающий
 
Регистрация: 13.02.2010
Сообщения: 104
Репутация: 10
По умолчанию

это хорошо) а мне то что делать?
Ответить с цитированием
  #14  
Старый 23.11.2012, 12:55
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от reqyz
это хорошо) а мне то что делать?
Ну так ты пытаешься перечислить окна у процесса у которого нет окон.
Тебе нужно работать с PID не того процесса который ты запустил, а того который появился этим загадочным способом запуска.
И всё же ещё раз попробуй способ который предложил NumLock, только в этот раз не по PID сравнивай, а о имени класса "CabinetWClass".
Ответить с цитированием
  #15  
Старый 23.11.2012, 13:01
reqyz reqyz вне форума
Начинающий
 
Регистрация: 13.02.2010
Сообщения: 104
Репутация: 10
По умолчанию

Цитата:
Сообщение от poli-smen
Ну так ты пытаешься перечислить окна у процесса у которого нет окон.
Тебе нужно работать с PID не того процесса который ты запустил, а того который появился этим загадочным способом запуска.
И всё же ещё раз попробуй способ который предложил NumLock, только в этот раз не по PID сравнивай, а о имени класса "CabinetWClass".
тогда я не смогу узнать что это мой, может мне както через опен процесс заставить эксплорер открыть ту папку в новом окне, не создавая новый процесс? и получить хэндл этого нового окна? реально?
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter