Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.007 c
1-64715
kay
2002-05-06 23:04
2002.05.20
Edit


3-64450
zx
2002-04-19 14:44
2002.05.20
ADOUpdateSQL???


1-64580
KpoT
2002-05-07 11:47
2002.05.20
Как програмно потянуть за бегунок громкости Wav-a?


3-64554
Vov
2002-04-24 09:56
2002.05.20
Как на клиенте ловить сообщения об update таблицы


3-64470
Брат
2002-04-22 12:00
2002.05.20
Сообщение DEADLOCK





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский