Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.03.28;
Скачать: CL | DM;

Вниз

путь к директории через handle окна hwnd   Найти похожие ветки 

 
Alexis ©   (2004-01-05 19:56) [0]

Получаю список всех открытых окон функцией GetWindow.Как по полученному хендлу окна определить полный путь к директории?
И еще вопрос: при получении названий всех окон(большая часть из которых принадлежит программам), как определить что это за окно-окно какой-либо программы или просто откртытая папка.

Заранее благодарю.


 
YuRock ©   (2004-01-05 20:19) [1]

Попробуй GetWindowThreadProcessId()


 
DVM ©   (2004-01-06 14:53) [2]

var
 hProcess: THandle;
 PID: integer;
 FileName: array [1..MAX_PATH] of char;
begin
 GetWindowThreadProcessId(hWnd, @PID);
 hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or ROCESS_VM_READ, false, PID);
 GetModuleFileNameEx(hProcess, 0, @Filename[1], SizeOf(Filename));
 CloseHandle(hProcess);
...


 
YuRock ©   (2004-01-06 17:38) [3]

Ну если дословно, то:


var
hProcess: THandle;
PID: integer;
FileName: array [1..MAX_PATH] of char;
begin
GetWindowThreadProcessId(hWnd, @PID);
hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or ROCESS_VM_READ, false, PID);
GetModuleFileNameEx(hProcess, 0, @Filename[1], SizeOf(Filename));

// ©  (06.01.04 14:53) DVM

 if UpperCase(String(Filename)) = "EXPLORER.EXE"
 then ShowMessage("Просто папка")
 else ShowMessage("окно программы "" + String(Filename) + """);
end;


 
VMcL ©   (2004-01-06 17:52) [4]

>>DVM ©  (06.01.04 14:53) [2]

Если мне не изменяет склероз, GetModuleFileNameEx есть только в Win2000 и выше. Или я не прав?


 
BiN ©   (2004-01-06 18:16) [5]

в 9х используй тулхелп-функции


 
YuRock ©   (2004-01-06 18:25) [6]

В 32s/95/98/NT/2k/XP/03 есть GetModuleFileName() - только без второго параметра (в данном случае он и не нужен).


 
BiN ©   (2004-01-06 18:41) [7]

2 YuRock
GetModuleFileName в данном примере будет всегда возвращать 0 (кстати, и GetLastError тоже)


 
Alexis ©   (2004-01-07 10:43) [8]

2 VMcL-склероз не изменяет:) Спасибо за помощь, попробую.
Кстати задам уж похожий вопрос-при использовании функции
Process32First(snapshot,process_info) получаю false, хотя со snapshot"ом все нормально.В хелпе написано что второй параметр должен быть адресом структуры, но при @process_info возникает несовместимость типов.
В чем причина?


 
Alexis ©   (2004-01-07 10:43) [9]

2 VMcL-склероз не изменяет:) Спасибо за помощь, попробую.
Кстати задам уж похожий вопрос-при использовании функции
Process32First(snapshot,process_info) получаю false, хотя со snapshot"ом все нормально.В хелпе написано что второй параметр должен быть адресом структуры, но при @process_info возникает несовместимость типов.
В чем причина?


 
VMcL ©   (2004-01-08 17:34) [10]

>>Alexis ©  (07.01.04 10:43) [9]

Неправильно.
function Process32First(hSnapshot: THandle; var lppe: TProcessEntry32): BOOL;


 
BiN ©   (2004-01-08 18:27) [11]

а ты не забыл process_info.dwSize:=SizeOf(process_info)


 
Alexis ©   (2004-01-09 01:08) [12]

2 BiN-нет, не забыл.
2 VMcL-так я ведь и объявил process_info как TProcessEntry32, в чем же дело?


 
VMcL ©   (2004-01-11 03:23) [13]

>>Alexis ©  (09.01.04 01:08) [12]

Вот выдрал кусок из своего класса, может поможет (гы, каламбур):

function TProcessList.UpdateList: Boolean;
var
 SnapHandle, ProcessHandle: THandle;
 PE32: TProcessEntry32;
 PPE: PProcessEntry;
 ModuleName: packed array [0 .. 4095] of AnsiChar;
begin
 Result := False;
 FList.Clear;

 SnapHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 if Integer(SnapHandle) = -1 then Exit;
 try
   PE32.dwSize := SizeOf(PE32);
   if Process32First(SnapHandle, PE32) then
   begin
     repeat
       PPE := FList.NewItem;
       with PPE^, PE32 do
       begin
         RefCount := cntUsage;
         ProcessId := th32ProcessID;
         DefaultHeapId := th32DefaultHeapID;
         ModuleId := th32ModuleID;
         ThreadCount := cntThreads;
         ParentProcessID := th32ParentProcessID;
         BasePriorityClass := pcPriClassBase;
         Flags := dwFlags;
         ExeFile := AnsiString(szExeFile);
         if FWinNT then
         begin
           ProcessHandle := OpenProcess(PROCESS_QUERY_INFORMATION or
             PROCESS_VM_READ, False, ProcessId);
           if ProcessHandle <> 0 then
             try
               if GetModuleFileNameEx(ProcessHandle, ModuleId,
                 ModuleName, SizeOf(ModuleName) - 1) <> 0
               then
                 ExeFile := AnsiString(ModuleName);
             finally
               CloseHandle(ProcessHandle);
             end;
         end;
       end;
     until not Process32Next(SnapHandle, PE32);
     Result := True;
   end;
 finally
   CloseHandle(SnapHandle);
 end;
end;


P.S. В этом методе есть несколько "левых" переменных (полей), по смыслу догадаешься, что они означают, надеюсь :)



Страницы: 1 вся ветка

Текущий архив: 2004.03.28;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.023 c
1-1078585143
Alexey_
2004-03-06 17:59
2004.03.28
Увеличение размеров Hint у иконки в Трей е


14-1078093670
Sever-rds
2004-03-01 01:27
2004.03.28
В Вашем аэропорту, Домодевово, банально грабят людей


9-1062001143
Ландграф Павел
2003-08-27 20:19
2004.03.28
Посмотрите мою игрушку (2D скролл-аркада на DelphiX c исходникам)


1-1078617415
Lena19
2004-03-07 02:56
2004.03.28
указатель на переменную


1-1079001204
AlexanderSK
2004-03-11 13:33
2004.03.28
Как передать строку из пакета основному приложению?