Главная страница
    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.032 c
14-1077791522
Undert
2004-02-26 13:32
2004.03.28
PHP ....


14-1077206434
Владислав
2004-02-19 19:00
2004.03.28
Что с любимым форумом?


14-1077706250
Morg
2004-02-25 13:50
2004.03.28
Оптимальный вариант передачи данных


7-1072692942
Romkin
2003-12-29 13:15
2004.03.28
TRichTextBox, определение размера текста


14-1076913252
Красная Майка
2004-02-16 09:34
2004.03.28
Напоминаю о MMP на следующей неделе.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский