![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
чужое окно [D5, WinXP]
m0l0doy © (2005-01-10 23:20:00)Уважаемые! Поясните, пожалуйста, как мне узнать путь к файлу породившему окно :)
я ловлю окно так
h:=findwindow(nil, 'заголовок');
и мне необходимо узнать, где находится exe файл
заранее спасибо
sniknik (2005-01-11 20:45:00) [1]вот что было у меня (это я уже типа дома ;о)))
uses psapi;
function IsWinNT4Plus: Boolean;
var VI: TOSVersionInfo;
begin
FillChar(VI, SizeOf(TOSVersionInfo), 0);
VI.dwOSVersionInfoSize:= SizeOf(TOSVersionInfo);
GetVersionEx(VI);
with VI do
Result:= (dwPlatformId = VER_PLATFORM_WIN32_NT) and (dwMajorVersion >= 4);
end;
function GetWindowFileName(const hWin: HWND): string;
var
lpBuff: PChar;
nCount: Integer;
dwProcessId: Cardinal;
hInst: Cardinal;
hProcess: Cardinal;
begin
Result:= '';
nCount:= 1024;
GetMem(lpBuff, nCount);
try
if IsWinNT4Plus then begin
hInst:= GetWindowLong(hWin, GWL_HINSTANCE);
GetWindowThreadProcessId(hWin, dwProcessId);
hProcess:= OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, false, dwProcessId);
if hProcess > 0 then
try
GetModuleFileNameEx(hProcess, hInst, lpBuff, nCount);
finally
CloseHandle(hProcess);
end;
end else
GetWindowModuleFileName(hWin, lpBuff, nCount);
Result:= string(lpBuff);
finally
FreeMem(lpBuff);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Label1.Caption:= GetWindowFileName(FindWindow('SHELL_TRAYWND', nil));
end;
работает, но вот как насчет "во всех виндах" х.з. не проверял (только в w2k).
m0l0doy (2005-01-11 18:32:00) [2]sniknik, TUser, спасибо!
ночью буду с этим разбираться, отпишусь как и чего
TUser (2005-01-11 12:12:00) [3]
> sniknik
msdn пишет, что 95 и NT, начиная с 4.0 SP3
TUser (2005-01-11 12:11:00) [4]Вот в ХР
procedure TForm1.Button1Click(Sender: TObject);
var h: hWND;
p: PAnsiChar;
i: integer;
k: integer;
begin
AllocConsole;
if (Edit1.Text <> '') or
(Edit2.Text <> '') then begin
writeln('Starting');
if Edit2.Text = '' then
h:=FindWindow(nil,PAnsiChar(Edit1.Text))
else
if Edit1.Text = '' then
h:=FindWindow(PAnsiChar(Edit2.Text),nil)
else
h:=FindWindow(PAnsiChar(Edit2.Text),PAnsiChar(Edit1.Text));
Label1.Caption:='handle = '+inttostr(h);
writeln('handle is '+inttostr(h));
if h <> 0 then begin
k:=32;
repeat
k:=k*2;
GetMem(p,k);
try
i:=GetWindowModuleFileName(h,p,k);
if i < k then begin
writeln('length = '+inttostr(i));
Label2.Caption:=copy(p,1,i);
writeln(' name is '+Label2.Caption);
end;
finally
FreeMem(p);
end;
until i < k;
end;
end else
writeln('Both nil');
writeln('');
end;
PS. Совершенно не понимаю, почему FindWindow не работает в FP/Лазаре. Я там сначала это написАл, долго удивлялся, что h = 0. Потом перенем с D7, и с теми же параметрами - все заработало. Кто-нибудь знает в чем дело?
sniknik (2005-01-11 12:00:00) [5]Fay © (11.01.05 11:48) [10]
может быть может быть, но деление на 95 vs остальные там делалось зачемто (или NT - остальные), да ладно в обшем. черт с ним, даже думать неохота на эту тему.
Fay (2005-01-11 11:48:00) [6]>> GetWindowModuleFileName работает но только в 95-ом (насколько смутно помню)
Нет
sniknik (2005-01-11 11:41:00) [7]GetWindowModuleFileName работает но только в 95-ом (насколько смутно помню)
в других нужно по GetWindowModuleFileName Exполучать и не по хендлу окна а по хендлу процесса (найти по оконному, открыть, получить, закрыть). неохота разбиратся (готовый код дома есть), если не дадут раньше положу вечером (может быть, если ветку не удалят, к тому идет).
> посмеялись? весело?
> я в шоке.. человек просит помощи, а вы рж0те
а ты повода не давай, у людей может единственное развлечение сдесь посмеятся над безграмотным кодом... не ассоциируй с собой.
Kerk (2005-01-11 11:28:00) [8]m0l0doy (11.01.05 11:23) [7]
сейчас здесь будет написано "Удалено модератором" :)
m0l0doy (2005-01-11 11:23:00) [9]заебись
спасибо ребята
посмеялись? весело?
я в шоке.. человек просит помощи, а вы рж0те
Kerk (2005-01-11 06:41:00) [10]m0l0doy (11.01.05 0:13) [2]
LOL
Fay (2005-01-11 06:33:00) [11]Весь код в [2] - бред.
m0l0doy (2005-01-11 03:47:00) [12]а как?
GanibalLector (2005-01-11 01:07:00) [13]>nsize := 128;
Это не так.
m0l0doy (2005-01-11 00:13:00) [14]на пашет чего-то..
делаю так
h:=findwindow(nil, 'заголовок');
if h=0 then exit;
nsize := 128;
SetLength(fName, nsize);
SetLength(fName,GetWindowModuleFileName(h,pchar(fName),nsize));
showmessage(fName);
он выдает мне адрес к файлу МОЕЙ программы Ж)
хотя окно 100% не мое
code_ (2005-01-11 00:01:00) [15]GetWindowModuleFileName(h, ...)