Форум: "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.031 c