|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Странный 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
|
||||
|
||||
Цитата:
UPD. Кстати, а эксплорер хоть запускается? Он же завершается, если обнаруживает что одна его копия уже запущена. Последний раз редактировалось poli-smen, 23.11.2012 в 11:23. |
#3
|
|||
|
|||
так я с одмина сижу, да и если через WindowFromPoint(a) работает, почему так не хочет?
|
#4
|
||||
|
||||
Цитата:
Кстати, а эксплорер хоть запускается? Он же завершается, если обнаруживает что одна его копия уже запущена. |
#5
|
|||
|
|||
Цитата:
да, запускается нормально и никуда не исчезает, прямо сейчас на него смотрю, и через енум хэндл 0, а через наведение, находит( блин.. |
#6
|
||||
|
||||
Цитата:
|
#7
|
|||
|
|||
Цитата:
Последний раз редактировалось reqyz, 23.11.2012 в 11:45. |
#8
|
||||
|
||||
EnumWindows находит CabinetWClass. и даже можно до SysListView32 добраться
Пишу программы за еду. __________________ |
#9
|
||||
|
||||
Цитата:
Код:
Caption:=IntToStr(ProcInfo.dwProcessId); А ты вообще как определяешь что у тебя запущено несколько процессов "explorer.exe". Что-то помоему врёшь ты мне. |
#10
|
|||
|
|||
у меня всё работает, эксплорер открывает папку с выделенным файлом программы, но хэндл не находит, хотя в любых других программах в том же блокноте всё ок
|
#11
|
|||
|
|||
Цитата:
|
#12
|
||||
|
||||
Всё. Получилось запустить ещё один эксплорер твоим способом, я просто не туда скопировал в прошлый раз.
Только вот в диспетчере задач он запускается с PID=195008, а у меня в заголовке формы написано "194208". Т.е. хоть и запустился, но явно не тот который я запускал. |
#13
|
|||
|
|||
это хорошо) а мне то что делать?
|
#14
|
||||
|
||||
Цитата:
Тебе нужно работать с PID не того процесса который ты запустил, а того который появился этим загадочным способом запуска. И всё же ещё раз попробуй способ который предложил NumLock, только в этот раз не по PID сравнивай, а о имени класса "CabinetWClass". |
#15
|
|||
|
|||
Цитата:
|