[C, C++] StatusBar, SendMessage et SB_GETTEXT

StatusBar, SendMessage et SB_GETTEXT [C, C++] - C++ - Programmation

Marsh Posté le 21-09-2002 à 10:56:18    

J'aimerais récupurer le contenue d'une StatusBar.
 
J'ai essayé la même méthode que pour les listbox avec SB_GETTEXT mais ça n'a pas l'air d'être pareil ...  
Et pourtant j'arrive à changer la couleur grace à SB_SETBKCOLOR
 
J'ai trouvé un topic sur ce sujet mais c'est en Delphi ;)
-> http://www.experts-exchange.com/Pr [...] 09741.html
 
Si quelqu'un c'est comment faire :hello:
@+

Reply

Marsh Posté le 21-09-2002 à 10:56:18   

Reply

Marsh Posté le 21-09-2002 à 10:58:29    

WM_GETTEXT ?

Reply

Marsh Posté le 21-09-2002 à 11:00:28    

youdontcare a écrit a écrit :

WM_GETTEXT ?


c'est ce que précise ton lien ... :D
 
a priori, c'est toujours WM_GETTEXT pour récupérer le texte d'une fenêtre, sauf si celle-ci contient plusieurs éléments de texte (comme une listbox).

Reply

Marsh Posté le 21-09-2002 à 11:01:26    

Oui mais WM_GETTEXT ne donne que le texte dans l'index 0 de la StatusBar :(

Reply

Marsh Posté le 21-09-2002 à 11:04:25    

Je parle de celui-ci :

Citation :


uses commctrl;
 
procedure TForm1.Button1Click(Sender: TObject);
var
 ii, iNumParts: integer;
 s : array[0..255]of char;
 MainWindow,StatusBar : hwnd;
 p1 : pointer;
begin
  MainWindow:= FindWindow('ExploreWClass',nil);
 If MainWindow <> 0 then begin
 StatusBar := FindWindowEx(MainWindow,0,'msctls_statusbar32',nil);
   if statusbar <> 0 then
     with Window(StatusBar).OwnerProcess do begin
       p1 := AllocMem(256, true);
       try
         iNumParts:=SendMessage(statusBar,sb_getparts,255,0);
         for ii := 0 to inumparts -1 do begin
           SendMessage(statusbar, SB_GETTEXTLENGTH, ii, 0);
           SendMessage(statusbar,SB_GETTEXT,ii,Longint(p1));
           ReadMemory(p1^, s[0], 256);
           MessageBox(0, s, 'info', 0);
         end;
       finally FreeMem(p1) end;
     end
     else showmessage('window statusbar not found';);
 end
  else showmessage('window not found';);
end;


 
Et celui-ci :

Citation :


procedure ShowStatusExample;
const
 cBuf = 1024;
var
 s: String;
 hMain: HWND;
 hStatus: HWND;
 idProcess: DWORD;
 hProcess: THandle;
 pBuf: Pointer;
 n: cardinal;
 i: integer;
 cParts: integer;
begin
 // Get main window handle
 hMain := FindWindowEx(0, 0, 'IEFrame', nil);
 if hMain = 0 then RaiseLastWin32Error;
 
 // Get process handle
 GetWindowThreadProcessID(hMain, @idProcess);
 hProcess := OpenProcess(PROCESS_ALL_ACCESS, False, idProcess);
 if hProcess = 0 then RaiseLastWin32Error;
 
 // Allocate buffer in process
 pBuf := VirtualAllocEx(hProcess, nil, cBuf, MEM_COMMIT, PAGE_READWRITE);
 if pBuf = nil then RaiseLastWin32Error;
 
 try
   // Show main window's text
   n := GetWindowTextLength(hMain);
   SetLength(s, n);
   GetWindowText(hMain, PChar(s), n);
   ShowMessage(s);
 
   // Get status bar handle
   hStatus := FindWindowEx(hMain, 0, 'msctls_statusbar32', nil);
   if hStatus = 0 then RaiseLastWin32Error;
 
   // Get number of parts in status bar
   cParts := SendMessage(hStatus, SB_GETPARTS, 0, 0);
 
   for i := 0 to cParts - 1 do
   begin
 
     // Get status bar text into buffer
     n := LoWord(SendMessage(hStatus, SB_GETTEXT, i, Integer(pBuf)));
     SetLength(s, n);
 
     // Read buffer
     if not ReadProcessMemory(hProcess, pBuf, PChar(s), n, n) then
       RaiseLastWin32Error;
 
     if s <> '' then
       ShowMessage(IntToStr(i) + ': ' + s);
   end;
 
 finally
   VirtualFreeEx(hProcess, pBuf, cBuf, MEM_DECOMMIT);
 end;
 
end;

Reply

Marsh Posté le 21-09-2002 à 11:09:16    

ça devrait effectivement marcher avec SB_GETTEXT. tu as regardé avec spy++ si la status bar avait des fenêtre filles ?

Reply

Marsh Posté le 21-09-2002 à 11:48:24    

MMhhmm attend ... Non elle n'a pas de fenêtre fille ;)
 
J'ai oublié de dire ... je suis sur Borland C++ Builder ( je pense que WinSight c'est la même chose que Spy++ ;) )
 
Et pour revenir à mon problème je pense que SB_GETTEXT me retourne l'adresse en memoire du texte et non le texte ...

Reply

Marsh Posté le 21-09-2002 à 12:10:11    

strikenet a écrit a écrit :

Et pour revenir à mon problème je pense que SB_GETTEXT me retourne l'adresse en memoire du texte et non le texte ...


cf la doc : http://msdn.microsoft.com/library/ [...] ettext.asp
 
tu dois spécifier le buffer à remplir. il y a SB_GETTEXTLENGTH qui retourne la taille nécessaire. déjà, ce message renvoie-t-il une valeur cohérente ?
 
poste ton code, j'ai l'impression qu'il y a plutôt un problème de buffer.

Reply

Marsh Posté le 21-09-2002 à 13:28:33    

J'ai simplifié le code pour mes tests :

Code :
  1. HWND Handle = (HWND)???;
  2.   AnsiString nbCaractere;
  3.   AnsiString Element;
  4.   // SB_GETTEXTLENGTH ça marche
  5.   nbCaractere = LOWORD(SendMessage(Handle, SB_GETTEXTLENGTH, 0, 0));
  6.   // SB_GETTEXT ne marche pas pb avec buffer ?
  7.   SendMessage(Handle, SB_GETTEXT, 0, (LPARAM)Element.c_str());
  8.   MessageBoxA(NULL, nbCaractere.c_str(), "", 0);
  9.   MessageBoxA(NULL, Element.c_str(), "", 0);
  10.   // j'ai essayé en virant de le caractère NULL mais c'est pareil


Message édité par strikenet le 21-09-2002 à 13:30:28
Reply

Marsh Posté le 21-09-2002 à 13:48:47    

>> nbCaractere = LOWORD(SendMessage(Handle, SB_GETTEXTLENGTH, 0, 0));
 
ça marche ? ça marche comment, il y a un opérateur de conversion int -> AnsiString ?
 
>>  SendMessage(Handle, SB_GETTEXT, 0, (LPARAM)Element.c_str());
 
là aucune idée, je ne connais pas AnsiString. tu devrais essayer avec un bon vieux char* des familles :
 
int numChars = LOWORD(SendMessage(Handle, SB_GETTEXTLENGTH, 0, 0));
char* buffer = new char [numChars];
buffer[0] = 0; // cf la doc
int numChars2 = LOWORD(SendMessage(Handle, SB_GETTEXT, 0, buffer));
 
MessageBox(NULL, buffer, NULL, 0);
 
et regarde si numChars == numChars2.
 
//
 
:D ha, et je viens de remater le topic que tu as filé : si tu veux lire le texte d'une autre application, passer directement un pointeur n'est pas possible : il n'est valide que dans ton app. il y a un bout de code avec OpenProcess & co en bas.  
 
(WM_GETTEXT a le même problème, mais c'est patché en interne pour la compatibilité descendante ... :/)

Reply

Marsh Posté le 21-09-2002 à 13:48:47   

Reply

Marsh Posté le 21-09-2002 à 15:32:58    

Quand je met : char* buffer = new char [numChars];
numchars2 = 0
 
Avec AnsiString numchars=numchars2 :heink:
 
Personne n'a d'idée [:zoutte]

Reply

Marsh Posté le 21-09-2002 à 15:37:24    

strikenet a écrit a écrit :

Personne n'a d'idée [:zoutte]


si c'est une autre app, il faut faire openprocess() & co. cf message précédent qui cf au thread.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed