Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

ExeName [D5]


Страницы:   1 2

Gayrus ©   (2002-03-13 16:29:00) 

Как узнать имя файла по Названию окна(надписи).


alexec   (2002-03-20 09:08:00) [1]

Удалено модератором


Anatoly Podgoretsky   (2002-03-20 08:07:00) [2]

GetWindowThreadProcessId(wnd,@pID);


alexec   (2002-03-20 06:53:00) [3]

В строке
GetWindowThreadProcessId(wnd, pID);
ругается на pID
Incompatible types: "Cardinal" and "Pointer"


Raptor   (2002-03-19 11:26:00) [4]

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-19 06:50:00) [5]

Почему под W2K возвращает только имя файла, мне нужен путь к файлу


Gayrus   (2002-03-18 16:35:00) [6]

GetModuleFileName - ошибки не выдаёт, файл находит, а система виснет :)


paul_shmakov   (2002-03-17 18:06:00) [7]

еще раз повторюсь:

win95, win98, winme, win2k, winxp - все эти операционки имеют toolhelp api

winnt - стандартная поставка не содержит psapi.dll !!! под этой ос информация о процессах и т.п. собирается с помощью performance counters из реестра, что очень неудобно. или можно воспользоваться недокументированной функцией ZwQuerySystemInformation из ntdll.dll.


paul_shmakov   (2002-03-17 17:42:00) [8]

2 VuDZ:

функция GetModuleFileNameEx является частью psapi.dll, а эта библиотека не входит в стандартную поставку winnt. она добавляется каким-то service pack-ом или еще чем-то.

так что для winnt все несколько сложнее.. но тоже решаемо


VuDZ   (2002-03-17 14:14:00) [9]

win2k == winNT, если обратное не оговорено MSDN


Gayrus ?   (2002-03-17 14:04:00) [10]

А в Win2k также как и в NT?


Alx2   (2002-03-15 16:25:00) [11]

uses TLHelp32;


Gayrus ?   (2002-03-15 16:19:00) [12]

>Alx2 PROCESSENTRY32-у меня ошибка, мол нет такого


VuDZ   (2002-03-14 18:41:00) [13]


> >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);


Malder   (2002-03-14 16:43:00) [14]

Хочу добавить, что FindWindow найдет первое окно с таким именем. А таких окон может быть много...


Alx2   (2002-03-14 14:11:00) [15]

А вот его продолжение: http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1013768449&n=5


Alx2   (2002-03-14 14:09:00) [16]

Вот, нашел линк: http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1013668814&n=5


Alx2   (2002-03-14 14:06:00) [17]

Когда-то это уже поднималось.
Посему повторюсь:

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 13:57:00) [18]

>Nebula (13.03.02 17:10)
Кажется, на NT это не работает для чужих процессов.


Виктор Щербаков   (2002-03-14 13:36:00) [19]


> THandle - класс Delphi, инкапсулирующий в себя различные
> типы дескрипторов Windows.

THandle = LongWord;


Fellomena   (2002-03-14 12:37:00) [20]

hWnd - Window Handle (дескриптор окна). (4-х байтное целое, используемое в Windows)
THandle - класс Delphi, инкапсулирующий в себя различные типы дескрипторов Windows.
Это я так понимаю - если неправильно, то поправте меня.
Я везде использую HWND.
Хотя в принципе можно использовать и обычный Integer или Cardinal =)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо