Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.05.20;
Скачать: CL | DM;

Вниз

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 вся ветка

Текущий архив: 2002.05.20;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.022 c
1-64649
RaZEr
2002-05-08 07:40
2002.05.20
И снова MDI интерфейс


3-64528
Vasilii
2002-04-22 15:44
2002.05.20
проблемы с IBEvents?


4-64869
Serd_hhc
2002-03-17 10:44
2002.05.20
Хук (или ещё что), не использубю DLL.


1-64729
Proud Berdiyan
2002-05-01 14:54
2002.05.20
В чем глюк?


6-64769
Victor
2001-07-24 14:00
2002.05.20
Нужен WEB сервер