Форум: "WinAPI";
Текущий архив: 2002.05.20;
Скачать: [xml.tar.bz2];
ВнизExeName Найти похожие ветки
← →
Gayrus (2002-03-13 16:29) [0]Как узнать имя файла по Названию окна(надписи).
← →
gek (2002-03-13 16:34) [1]Никак
← →
Иван Шихалев (2002-03-13 16:41) [2]С какой стати нельзя-то?
FindWindow >>
GetWindowThreadProcessId >>
ToolHelp Functions
← →
Fellomena (2002-03-13 16:42) [3]Ну почему же никак !
CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); поможет 8)
← →
gek (2002-03-13 16:44) [4]> Иван Шихалев © (13.03.02 16:41)
> Fellomena (13.03.02 16:42)
Да уж... Про FindWindow я то и забыл.
Признаю ошибку. Был не прав.
← →
Nebula (2002-03-13 16:50) [5]Осторожно, на NT нет CreateToolhelp32Snapshot.
← →
Nebula (2002-03-13 17:10) [6]А еще можно воспользоваться GetWindowModuleFileName
← →
panov (2002-03-13 17:45) [7]http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1013668814&n=5
← →
Gayrus ? (2002-03-14 03:31) [8]А hWnd это и есть THandle? Я имею ввиду FindWindow.
← →
Fellomena (2002-03-14 12:37) [9]hWnd - Window Handle (дескриптор окна). (4-х байтное целое, используемое в Windows)
THandle - класс Delphi, инкапсулирующий в себя различные типы дескрипторов Windows.
Это я так понимаю - если неправильно, то поправте меня.
Я везде использую HWND.
Хотя в принципе можно использовать и обычный Integer или Cardinal =)
← →
Виктор Щербаков (2002-03-14 13:36) [10]
> THandle - класс Delphi, инкапсулирующий в себя различные
> типы дескрипторов Windows.
THandle = LongWord;
← →
Alx2 (2002-03-14 13:57) [11]>Nebula (13.03.02 17:10)
Кажется, на NT это не работает для чужих процессов.
← →
Alx2 (2002-03-14 14:06) [12]Когда-то это уже поднималось.
Посему повторюсь:
Var wProcessID : DWord;
Begin
hWnd ищем через FindWindow, потом получаем процесс, владеющий окном.
GetWindowThreadProcessId(hWnd, @wProcessID);
FileName := GetExeName(wProcessId);
Ниже описание GetExeName.
Но на NT4 это не работает
end;
Function GetExeName(wProcessID: DWORD): String;
Const
hProcessSnap: THandle = 0;
bRet: Boolean = False;
Var
pe32: PROCESSENTRY32;
me32: MODULEENTRY32;
Begin
Result := "";
// Take a snapshot of all processes currently in the system.
hProcessSnap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
If hProcessSnap = THandle( - 1) Then
Exit;
// Fill in the size of the structure before using it.
pe32.dwSize := sizeof(PROCESSENTRY32);
// Walk the snapshot of the processes, and for each process, get
// information to display.
If (Process32First(hProcessSnap, pe32)) Then
Begin
fillchar(me32, sizeof(me32), 0);
Repeat
If pe32.th32ProcessID = wProcessID Then
Result := PChar(@pe32.szExeFile);
Until (Result <> "") Or (Not Process32Next(hProcessSnap, pe32));
End;
// Do not forget to clean up the snapshot object.
CloseHandle(hProcessSnap);
End;
← →
Alx2 (2002-03-14 14:09) [13]Вот, нашел линк: http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1013668814&n=5
← →
Alx2 (2002-03-14 14:11) [14]А вот его продолжение: http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1013768449&n=5
← →
Malder (2002-03-14 16:43) [15]Хочу добавить, что FindWindow найдет первое окно с таким именем. А таких окон может быть много...
← →
VuDZ (2002-03-14 18:41) [16]
> >Nebula (13.03.02 17:10)
> Кажется, на NT это не работает для чужих процессов.
GetWindowModuleFileName
The GetWindowModuleFileName function retrieves the full path and file name of the module associated with the specified window handle.
но не забывайте, что в NT более мощная система управления потоками.
Мои 10 коп :>
HWND hwnd = (HWND)0x000A02DA; // MS VC++ IDE
char *sz = new char[MAX_PATH];
ZeroMemory(sz, MAX_PATH);
DWORD dwPID;
GetWindowThreadProcessId(hwnd, &dwPID);
HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, TRUE, dwPID);
GetModuleFileNameEx(hProc, 0, sz, MAX_PATH);
printf(sz);
← →
Gayrus ? (2002-03-15 16:19) [17]>Alx2 PROCESSENTRY32-у меня ошибка, мол нет такого
← →
Alx2 (2002-03-15 16:25) [18]uses TLHelp32;
← →
Gayrus ? (2002-03-17 14:04) [19]А в Win2k также как и в NT?
← →
VuDZ (2002-03-17 14:14) [20]win2k == winNT, если обратное не оговорено MSDN
← →
paul_shmakov (2002-03-17 17:42) [21]2 VuDZ:
функция GetModuleFileNameEx является частью psapi.dll, а эта библиотека не входит в стандартную поставку winnt. она добавляется каким-то service pack-ом или еще чем-то.
так что для winnt все несколько сложнее.. но тоже решаемо
← →
paul_shmakov (2002-03-17 18:06) [22]еще раз повторюсь:
win95, win98, winme, win2k, winxp - все эти операционки имеют toolhelp api
winnt - стандартная поставка не содержит psapi.dll !!! под этой ос информация о процессах и т.п. собирается с помощью performance counters из реестра, что очень неудобно. или можно воспользоваться недокументированной функцией ZwQuerySystemInformation из ntdll.dll.
← →
Gayrus (2002-03-18 16:35) [23]GetModuleFileName - ошибки не выдаёт, файл находит, а система виснет :)
← →
alexec (2002-03-19 06:50) [24]Почему под W2K возвращает только имя файла, мне нужен путь к файлу
← →
Raptor (2002-03-19 11:26) [25]2 alexec
Потому что ToolHelp32 под Win2k так работает. Посмотри немного выше (VuDZ © (14.03.02 18:41)) и увидишь пример как это надо делать в Win2k. Но там на С, а на Делфе это будет выглядеть примерно так:
function GetModuleFileNameEx(hProc:THandle; hModule: HINST; lpFilename: PChar; nSize: DWORD): DWORD;stdcall; external "psapi.dll" name "GetModuleFileNameExA";
Var
pID:DWORD;
hProc:THandle;
Buf:Array [0..255] Of Char;
wnd:HWND;
ExePath:String;
begin
GetWindowThreadProcessId(wnd, pID);
hProc:=OpenProcess(PROCESS_ALL_ACCESS,True,pID);
GetModuleFileNameEx(hProc,0,Buf,256);
ExePath:=Buf;
end;
← →
alexec (2002-03-20 06:53) [26]В строке
GetWindowThreadProcessId(wnd, pID);
ругается на pID
Incompatible types: "Cardinal" and "Pointer"
← →
Anatoly Podgoretsky (2002-03-20 08:07) [27]GetWindowThreadProcessId(wnd,@pID);
← →
alexec (2002-03-20 09:08) [28]Удалено модератором
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.05.20;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.006 c