Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.03.28;
Скачать: [xml.tar.bz2];

Вниз

путь к директории через 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 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.03.28;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.049 c
3-1077719673
ADER
2004-02-25 17:34
2004.03.28
Фильтр?!


14-1077729489
Натуся
2004-02-25 20:18
2004.03.28
Бесплатный хостинг с PHP


8-1069501491
Pa5ha
2003-11-22 14:44
2004.03.28
QTINTF.DLL - с чем его едят?


3-1077867010
The X
2004-02-27 10:30
2004.03.28
Interbase. Шаблон в процедуре для заполнения нулями до нуж. длины


8-1067867901
MAXHO
2003-11-03 16:58
2004.03.28
Звук, Звук и ещё раз звук......





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский