Конференция "WinAPI" » Найти окно по заголовку [D7]
 
  • Fr (28.03.13 22:22) [0]
    Есть программа ABCD.exe
    Когда она запущена, то видимый заголовок у нее - 'EFGH'.

    GetWindowText возвращает 'ABCD', а не 'EFGH'. В диспетчере задач она тоже видна как  'ABCD'.
    В случае переименования файла в DCBE.exe, GetWindowText возвращает 'DCBE'. При этом title окна не меняется и остается 'EFGH'

    Каким образом можно найти окно по заголовку 'EFGH'?
  • брат Птибурдукова (28.03.13 23:03) [1]
    а каким образом ты его ищешь?
  • Fr (28.03.13 23:54) [2]
    function AddWinInfo(WinHandle: HWnd; List:TStringList): Boolean; stdcall;
    var
     WinCaption: array[0..255] of Char;
    begin
     Result:=True;
     if isWindowVisible(WinHandle) then
       if GetWindow( WinHandle,GW_OWNER )=0 then begin
         GetWindowText( WinHandle, WinCaption, SizeOf(WinCaption) );
         if WinCaption<>''
           then List.Add(IntToStr(WinHandle));
       end;
    end;

    function AppInfo(): string;
    var
     descript   : TStringList;
     WinCaption : array[0..255] of char;
     i          : word;
     s: string;
    begin
     descript:=TStringList.Create;
     try
       s:='';
       with descript do begin
         Clear;
         EnumWindows( @AddWinInfo, LParam(descript) );
       end;
       for i:=0 to descript.Count-1 do begin
         GetWindowText( StrToInt(descript.strings[i]), WinCaption, SizeOf(WinCaption) );
         s:='Текст: '+WinCaption+'   Ид:'+descript.strings[i];
         if GetClassName( StrToInt(descript.strings[i]), WinCaption, SizeOf(WinCaption) )>0 then
           if WinCaption='TApplication'
             then result:=result+s+'   Class: '+WinCaption+#13#10;
       end;
     finally
       descript.Free;
     end;
    end;

    ShowMessage( AppInfo() );

  • DVM © (29.03.13 00:04) [3]

    > Fr   (28.03.13 22:22) 

    Посмотри Spy++ что показывает для этого окна
  • Игорь Шевченко © (29.03.13 09:51) [4]

    > Когда она запущена, то видимый заголовок у нее - 'EFGH'.
    >
    >
    > GetWindowText возвращает 'ABCD', а не 'EFGH'.


    Не от того окна вызываешь GetWindowText, пытаешься вызвать от окна TApplication.Handle, а его заголовок по умолчанию совпадает с именем исполняемого файла
  • Fr (29.03.13 21:42) [5]

    > Не от того окна вызываешь GetWindowText, пытаешься вызвать
    > от окна TApplication.Handle, а его заголовок по умолчанию
    > совпадает с именем исполняемого файла

    А как узнать нужное окно, связанное с exe, у которого надо вызвать GetWindowText ?
  • DVM © (29.03.13 22:07) [6]

    > Fr   (29.03.13 21:42) [5]

    [3]
  • Fr (29.03.13 23:22) [7]
    Переписал. Вот, что получилось в результате. покритикуйте, плиз:

    function AppInfo(): string;
    var
     SnapProc : THandle;
     ProcEntry: TProcessEntry32;
     PID       : DWORD;
    begin
     try
       Form1.Hint:='';
       SnapProc:=CreateToolhelp32Snapshot( TH32CS_SnapProcess, 0 );
       if SnapProc<>Invalid_Handle_Value then
         try
           ProcEntry.dwSize:=SizeOf( TProcessEntry32 );
           if Process32First( SnapProc, ProcEntry ) then
           repeat
             PID:=ProcEntry.th32ProcessID;
             EnumWindows( @EnumWindowsProc, PID );
           until not Process32Next( SnapProc, ProcEntry )
         finally
           CloseHandle( SnapProc )
         end
       finally
         result:=Form1.Hint;
       end;
    end;

    function EnumWindowsProc( Wnd: HWnd; tmpPID: DWORD ): Boolean; stdcall;
    var
     WinCaption: array[0..255] of char;
     WndPID    : DWORD;
    begin
     Result:=True;
     GetWindowThreadProcessID( Wnd, @WndPID );
     if WndPID=tmpPID then begin
       GetWindowText( Wnd, WinCaption, SizeOf(WinCaption) );
       if Pos('bla-bla-bla', WinCaption)>0 then begin
           Form1.Hint:=Form1.Hint+'(PID='+IntToStr(tmpPID)+') (Wnd='+IntToStr(Wnd)+') '+WinCaption+#13#10;
           result:=False;
       end;
     end
    end;

    ShowMessage( AppInfo() );

  • Игорь Шевченко © (30.03.13 10:53) [8]

    > покритикуйте, плиз:


    А тебе это вообще зачем надо ?
  • Fr (30.03.13 11:28) [9]

    > А тебе это вообще зачем надо ?

    Чтобы знать - правильно ли я делаю, нет ли тут скрытых глюков каких-нибудь
  • Игорь Шевченко © (30.03.13 14:41) [10]

    > Чтобы знать - правильно ли я делаю, нет ли тут скрытых глюков
    > каких-нибудь


    Добиться ты чего хочешь ?
  • DVM © (30.03.13 14:43) [11]

    > Игорь Шевченко ©   (30.03.13 14:41) [10]


    >
    > Добиться ты чего хочешь ?

    Найти окно по заголовку же! :)
  • brother © (31.03.13 08:41) [12]
    > Pos('bla-bla-bla'


    > Form1.Hint:=Form1.Hint

    сильно!
  • Игорь Шевченко © (31.03.13 11:55) [13]

    > Найти окно по заголовку же! :)


    Обычно для этого FindWindow(Ex) используют, название более подходящее
 
Конференция "WinAPI" » Найти окно по заголовку [D7]
Есть новые Нет новых   [134430   +4][b:0][p:0.002]