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

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

чужое окно [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, ...)


Наверх

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