Форум: "WinAPI";
Текущий архив: 2005.03.13;
Скачать: [xml.tar.bz2];
ВнизКак по процессу узнать заголовок окна? Найти похожие ветки
← →
grigory © (2005-02-01 13:17) [0]Подскажите,можно ли зная имя процесса, узнать заголовок окна!
Например процесс outlook.exe может иметь различные заголовки, в зависимости от версии и от того какая папка активирована!
"Входящие.." "Аутлук сегодня.."
← →
Kerk © (2005-02-01 13:24) [1]Как ты узнаешь у какого окна процесса узнавать заголовок?
← →
VsInLg (2005-02-01 13:24) [2]unit RDapi;
interface
uses Windows;
type
TPROCESSENTRY32 = packed record
dwSize: DWORD;
cntUsage: DWORD;
th32ProcessID: DWORD; // this process
th32DefaultHeapID: DWORD;
th32ModuleID: DWORD; // associated exe
cntThreads: DWORD;
th32ParentProcessID: DWORD; // this process"s parent process
pcPriClassBase: Longint; // Base priority of process"s threads
dwFlags: DWORD;
szExeFile: array[0..MAX_PATH - 1] of Char;// Path
end;
TCreateToolhelp32Snapshot = function (dwFlags, th32ProcessID: DWORD): THandle stdcall;
TProcess32First = function (hSnapshot: THandle; var lppe: TProcessEntry32): BOOL stdcall;
TProcess32Next = function (hSnapshot: THandle; var lppe: TProcessEntry32): BOOL stdcall;
function GetWindowsVer:Shortint;
function GetAppExeName(WndHWND:Cardinal):string;
function GetAppExeNameNT(WndHWND:Cardinal):string;
function GetAppExeName9X(WndHWND:Cardinal):string;
implementation
const
kernel32 = "kernel32.dll";
var
CreateToolhelp32Snapshot:TCreateToolhelp32Snapshot;
{ function GetWindowsVer:Shortint Определяет текущую версию Виндовоза.
Возвращает одно из следующих значений:
0 - Win 9x/me
1 - Win на основе NT (NT 4, W2K, WinXP, Win2003)
-1 - Другая версия Виндовоза (скорее всего Win 3.1 либо что-то похожее)}
function GetWindowsVer:Shortint;
var
OsVer:_OSVERSIONINFOA;
begin
OsVer.dwOSVersionInfoSize:=SIZEOF(_OSVERSIONINFOA);
if GetVersionEx(OsVer) then
case OsVer.dwPlatformId of
VER_PLATFORM_WIN32_WINDOWS: Result:=0;
VER_PLATFORM_WIN32_NT: Result:=1;
else
Result:=-1;
end;
end;
{function GetAppExeName(WndHWND:Cardinal):string возвращает полное название
имени файла просесса с которым связанно окно WndHWND независимо от платформы
(Win 9.x/ME, Win2k, WinXP)}
function GetAppExeName(WndHWND:Cardinal):string;
var
AppExeName:string;
begin
case GetWindowsVer of
0:
begin
AppExeName:=GetAppExeName9X(WndHWND);
if AppExeName="" then
Result:="ExeName not detected";
end;
1:
begin
AppExeName:=GetAppExeNameNT(WndHWND);
if AppExeName="" then
Result:="ExeName not detected";
end;
end;
Result:=AppExeName;
end;
{function GetAppExeNameNT(WndHWND:Cardinal):string [WinNT only]
Определяет полное название имени файла процесса
с которым связанно окно WndHWND.}
function GetAppExeNameNT(WndHWND:Cardinal):string;
var
KernelHandle,PID,HSnap:Cardinal;
pe32:TPROCESSENTRY32;
ModName:array[0..MAX_PATH] of Char;
CreateToolhelp32Snapshot:TCreateToolhelp32Snapshot;
Process32First:TProcess32First;
Process32Next:TProcess32Next;
begin
KernelHandle:=GetModuleHandle(kernel32);
@CreateToolhelp32Snapshot:=GetProcAddress(KernelHandle,"CreateToolhelp32Snapshot");
@Process32First:=GetProcAddress(KernelHandle,"Process32First");
@Process32Next:=GetProcAddress(KernelHandle,"Process32Next");
Result:="";
if GetWindowThreadProcessId(WndHWND,@PID)=0 then
Exit;
hSnap:=CreateToolhelp32Snapshot(2,PID);
if hSnap=DWord(-1) then
Exit;
pe32.dwSize:=sizeof(TPROCESSENTRY32);
if Process32First(HSnap,pe32) then
if GetModuleFileName(pe32.th32ModuleID,ModName,MAX_PATH)<>0 then
Result:=String(ModName);
CloseHandle(HSnap);
end;
{function GetAppExeName9X(WndHWND:Cardinal):string [Win9x/ME only]
Определяет полное название имени файла процесса
с которым связанно окно WndHWND.}
function GetAppExeName9X(WndHWND:Cardinal):string;
var
pe32:TPROCESSENTRY32;
KernelHandle,PID,hSnap:Cardinal;
CreateToolhelp32Snapshot:TCreateToolhelp32Snapshot;
Process32First:TProcess32First;
Process32Next:TProcess32Next;
begin
KernelHandle:=GetModuleHandle(kernel32);
@CreateToolhelp32Snapshot:=GetProcAddress(KernelHandle,"CreateToolhelp32Snapshot");
@Process32First:=GetProcAddress(KernelHandle,"Process32First");
@Process32Next:=GetProcAddress(KernelHandle,"Process32Next");
Result:="";
if GetWindowThreadProcessId(WndHWND, @PID)=0 then
exit;
hSnap:=CreateToolhelp32Snapshot(2,PID);
if hSnap=DWord(-1) then
exit;
pe32.dwSize:=sizeof(TPROCESSENTRY32);
if Process32First(hSnap,pe32) and (PId=pe32.th32ProcessID) then
begin
Result:=pe32.szExeFile;
CloseHandle(hSnap);
exit;
end;
while (Process32Next(hSnap, pe32)) and (PID<>pe32.th32ProcessID) do;
if PId=pe32.th32ProcessID then
Result:=pe32.szExeFile;
CloseHandle(hSnap);
end;
end.
← →
grigory © (2005-02-01 13:29) [3]
> Kerk © (01.02.05 13:24) [1]
> Как ты узнаешь у какого окна процесса узнавать заголовок?
:)) а разве не я это спросил?
я так понимаю..что то окно, которое активировано в данный момент!
← →
Digitman © (2005-02-01 13:35) [4]
> я так понимаю..что то окно, которое активировано в данный
> момент!
а нахрена тебе тогда "имя процесса", спрашивается ?
есть активное (переднеплановое, например, и имеющее фокус ввода) окно.. нафих имя процесса-то ? и без него как-нть обойдется, думаю) ..
← →
grigory © (2005-02-01 13:39) [5]нет..не совсем! Ну вот у аутлука это "Входящие", "исходящие", "удаленные" и т.д. Заголовок каждый раз разный, в зависимости от того что там выбрали! А он может быть свернут, и совсем даже неактивным!
← →
Digitman © (2005-02-01 13:47) [6]
> grigory © (01.02.05 13:39) [5]
ты вообще-то осознаешь, что в ходе работы процесса может быть создано БОЛЕЕ ЧЕМ ОДНО ОКНО ?
и при этом спрашивается, заголовок КАКОГО КОНКРЕТНО окна из более чем одного созданного в контексте дан.процесса ты хочешь поиметь ?
← →
Eraser © (2005-02-01 15:59) [7]grigory ©
Тебе надо решать обратную задачу: по дескриптору окна узназнать дескриптор процесса, и его имя.
Вчера на этом форуме обсуждалось...
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.03.13;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.036 c