[Delphi] GetText из msctls_statusbar32

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by ex3me, 20 Aug 2009.

  1. ex3me

    ex3me Member

    Joined:
    7 Jan 2009
    Messages:
    0
    Likes Received:
    63
    Reputations:
    0
    Нашел в инете замечательную функцию для получения текста из msctls_statusbar32 :

    Code:
    function GetStatusText(wndWindow: THandle;
      StatusBarClassName: string;
      PanelIndex: Byte): string;
    var
      WndStatusBar: THandle;
      StatusBarText: array[0..$FFF] of Char;
    begin
      Result := '';
      WndStatusBar := FindWindowEx(wndWindow, 0, PChar(StatusBarClassName), nil);
      if WndStatusBar <> 0 then
      begin
        if PanelIndex = 0 then
          SendMessage(WndStatusBar, WM_GETTEXT, $FFF, Longint(@StatusBarText))
        else
          SendMessage(WndStatusBar, SB_GETTEXT, PanelIndex, Longint(@StatusBarText));
        Result := StrPas(StatusBarText);
      end;
    end;
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      // Read statustext from Internet Explorer
      label1.Caption := GetStatusText(FindWindow('IEFrame', nil), 'msctls_statusbar32', 0);
    end;
    
    Да вот одна проблема: при GetStatusText(FindWindow('IEFrame', nil), 'msctls_statusbar32', 0);, где второй параметр равен нулю (указывает на номер области статус бара, нумеруются они с нуля), все работает отлично - текст грабится.
    Но если указать вторым параметром этой функции 1 или 2 (всего в статусбаре чужого приложения 3 области) - текст не грабится.

    Комметарии вроде: там стоит WM_GETTEXT, а там - SB_GETTEXT - не уместны... Пробовал по-разному, подставляя различные значения.

    Установка длины текста с помощью SB_GETTEXTLENGTH так же не помогает =\

    Может кто-то осилит довести до ума эту функцию, ибо уже 6й час бьюсь и все бестолку :mad: :mad: :mad:

    add: uses CommCtrl
     
  2. flacs

    flacs Member

    Joined:
    28 Jan 2009
    Messages:
    81
    Likes Received:
    31
    Reputations:
    6
    Переписал функцию, проверил работает.
    Code:
    function GetStatusTextEx(PanelIndex: cardinal): string;
      function GetWindowTextEx(Wnd: THandle): string;
      var
        __Text: array [0..$FFF] of Char;
        s: string;
      begin
        Result:='';
        if Wnd <> 0 then begin
          SendMessage(Wnd, WM_GETTEXT, $FFF, Longint(@__Text));
          Result := StrPas(__Text);
        end;
      end;
    const PANEL_CLASS = 'TabWindowClass';
    var wnd, nWnd, status: cardinal;
        buf: array [0..MAX_PATH-1] of char;
        num: cardinal;
    begin
      Result:='';
      wnd:=FindWindow('IEFrame', nil);
      nWnd:=GetWindow(Wnd, GW_CHILD); num:=0;
      {Перечисляем детей...}
      while (nWnd<>0) do begin
          nWnd:=GetNextWindow(nWnd, GW_HWNDNEXT);
          if (nWnd=0) then break;
          GetClassName(nWnd, buf, SizeOf(buf));
          if buf = PANEL_CLASS then  begin
            status:=FindWindowEx(nWnd, 0, 'msctls_statusbar32', nil);
            if num = PanelIndex then Result:=GetWindowTextEx(status);
            inc(num);
          end;
      end;
    end;
    
    
    изпользовать
    Label1.Caption:=GetStatusTextEx(1);
     
    #2 flacs, 20 Aug 2009
    Last edited: 20 Aug 2009
    2 people like this.
Loading...