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

Вниз

чужое окно   Найти похожие ветки 

 
m0l0doy   (2005-01-10 23:20) [0]

Уважаемые! Поясните, пожалуйста, как мне узнать путь к файлу породившему окно :)
я ловлю окно так
h:=findwindow(nil, "заголовок");
и мне необходимо узнать, где находится exe файл
заранее спасибо


 
code_   (2005-01-11 00:01) [1]

GetWindowModuleFileName(h, ...)


 
m0l0doy   (2005-01-11 00:13) [2]

на пашет чего-то..
делаю так

h:=findwindow(nil, "заголовок");
if h=0 then exit;
nsize := 128;
SetLength(fName, nsize);
SetLength(fName,GetWindowModuleFileName(h,pchar(fName),nsize));
 showmessage(fName);

он выдает мне адрес к файлу МОЕЙ программы Ж)
хотя окно 100% не мое


 
GanibalLector ©   (2005-01-11 01:07) [3]

>nsize := 128;
Это не так.


 
m0l0doy   (2005-01-11 03:47) [4]

а как?


 
Fay ©   (2005-01-11 06:33) [5]

Весь код в [2] - бред.


 
Kerk ©   (2005-01-11 06:41) [6]

m0l0doy   (11.01.05 0:13) [2]
LOL


 
m0l0doy   (2005-01-11 11:23) [7]

заебись
спасибо ребята
посмеялись? весело?
я в шоке.. человек просит помощи, а вы рж0те


 
Kerk ©   (2005-01-11 11:28) [8]

m0l0doy   (11.01.05 11:23) [7]
сейчас здесь будет написано "Удалено модератором" :)


 
sniknik ©   (2005-01-11 11:41) [9]

GetWindowModuleFileName работает но только в 95-ом (насколько смутно помню)
в других нужно по GetWindowModuleFileNameEx получать и не по хендлу окна а по хендлу процесса (найти по оконному, открыть, получить, закрыть). неохота разбиратся (готовый код дома есть), если не дадут раньше положу вечером (может быть, если ветку не удалят, к тому идет).

> посмеялись? весело?
> я в шоке.. человек просит помощи, а вы рж0те
а ты повода не давай, у людей может единственное развлечение сдесь посмеятся над безграмотным кодом... не ассоциируй с собой.


 
Fay ©   (2005-01-11 11:48) [10]

>> GetWindowModuleFileName работает но только в 95-ом (насколько смутно помню)
Нет


 
sniknik ©   (2005-01-11 12:00) [11]

Fay ©   (11.01.05 11:48) [10]
может быть может быть, но деление на 95 vs остальные там делалось зачемто (или NT - остальные), да ладно в обшем. черт с ним, даже думать неохота на эту тему.


 
TUser ©   (2005-01-11 12:11) [12]

Вот в ХР
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, и с теми же параметрами - все заработало. Кто-нибудь знает в чем дело?


 
TUser ©   (2005-01-11 12:12) [13]


> sniknik

msdn пишет, что 95 и NT, начиная с 4.0 SP3


 
m0l0doy   (2005-01-11 18:32) [14]

sniknik,TUser, спасибо!
ночью буду с этим разбираться, отпишусь как и чего


 
sniknik ©   (2005-01-11 20:45) [15]

вот что было у меня (это я уже типа дома ;о)))

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).



Страницы: 1 вся ветка

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

Наверх




Память: 0.5 MB
Время: 0.024 c
4-1102393341
dr Tr0jan
2004-12-07 07:22
2005.01.23
Как узнать хендл активного окна?


1-1105442099
Meneee
2005-01-11 14:14
2005.01.23
Excel


14-1103925114
palva
2004-12-25 00:51
2005.01.23
Фортран


3-1103195036
IBChaynik
2004-12-16 14:03
2005.01.23
Refresh


1-1105345131
HF-Trade
2005-01-10 11:18
2005.01.23
У TMainMenu можно изменить высоту?