![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
путь к директории через handle окна hwnd [D6, Win95/98, WinME, Win2k, WinXP]
Alexis © (2004-01-05 19:56:00)Получаю список всех открытых окон функцией GetWindow.Как по полученному хендлу окна определить полный путь к директории?
И еще вопрос: при получении названий всех окон(большая часть из которых принадлежит программам), как определить что это за окно-окно какой-либо программы или просто откртытая папка.
Заранее благодарю.
VMcL (2004-01-11 03:23:00) [1]>> 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. В этом методе есть несколько "левых" переменных (полей), по смыслу догадаешься, что они означают, надеюсь :)
Alexis (2004-01-09 01:08:00) [2]2 BiN-нет, не забыл.
2 VMcL-так я ведь и объявил process_info как TProcessEntry32, в чем же дело?
BiN (2004-01-08 18:27:00) [3]а ты не забыл process_info.dwSize:=SizeOf(process_info)
VMcL (2004-01-08 17:34:00) [4]>>Alexis © (07.01.04 10:43) [9]
Неправильно.
function Process32First(hSnapshot: THandle; var lppe: TProcessEntry32): BOOL;
Alexis (2004-01-07 10:43:00) [5]2 VMcL-склероз не изменяет:) Спасибо за помощь, попробую.
Кстати задам уж похожий вопрос-при использовании функции
Process32First(snapshot,process_info) получаю false, хотя со snapshot'ом все нормально.В хелпе написано что второй параметр должен быть адресом структуры, но при @process_info возникает несовместимость типов.
В чем причина?
Alexis (2004-01-07 10:43:00) [6]2 VMcL-склероз не изменяет:) Спасибо за помощь, попробую.
Кстати задам уж похожий вопрос-при использовании функции
Process32First(snapshot,process_info) получаю false, хотя со snapshot'ом все нормально.В хелпе написано что второй параметр должен быть адресом структуры, но при @process_info возникает несовместимость типов.
В чем причина?
BiN (2004-01-06 18:41:00) [7]2 YuRock
GetModuleFileName в данном примере будет всегда возвращать 0 (кстати, и GetLastError тоже)
YuRock (2004-01-06 18:25:00) [8]В 32s/95/98/NT/2k/XP/03 есть GetModuleFileName() - только без второго параметра (в данном случае он и не нужен).
BiN (2004-01-06 18:16:00) [9]в 9х используй тулхелп-функции
VMcL (2004-01-06 17:52:00) [10]>>DVM © (06.01.04 14:53) [2]
Если мне не изменяет склероз, GetModuleFileNameEx есть только в Win2000 и выше. Или я не прав?
YuRock (2004-01-06 17:38:00) [11]Ну если дословно, то:
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;
DVM (2004-01-06 14:53:00) [12]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-05 20:19:00) [13]Попробуй GetWindowThreadProcessId()