Page 1 sur 2

Récupérer le texte d'une StatusBar

Publié : mer. 17/mars/2004 16:06
par Le Soldat Inconnu
Salut,

un ch'tit problème pour récupérer le texte d'un statusbar. je n'arrive pour l'instant qu'a récupérer le texte du premier field mais pas du second.

Code : Tout sélectionner

#SizeWindowX = 300
#SizeWindowY = 200

Procedure Open_Window()
  If OpenWindow(0, 0, 0, #SizeWindowX, #SizeWindowY, #PB_Window_ScreenCentered, "Fenêtre")
    If CreateGadgetList(WindowID())
      TextGadget(1 ,3, #SizeWindowY - 40, #SizeWindowX - 6, 15, "Alt + F4 pour quitter")
      
      H = CreateStatusBar(2, WindowID())
      AddStatusBarField(100)
      AddStatusBarField(100)
      StatusBarText(2, 0, "truc")
      StatusBarText(2, 1, "machin")
      
      Txt.s = Space(200)
      GetWindowText_(H, @txt, 200)
      Debug txt
      
    EndIf
  EndIf
EndProcedure

; Debut du programme

Open_Window()

Repeat
  Event = WaitWindowEvent()
  
Until Event = #PB_EventCloseWindow
Merci d'avance.

Publié : mer. 17/mars/2004 16:27
par Anonyme2
Pour les StatusBAr, les messages à utiliser commencent par

SB

Pour récupérer le texte utilise SB_GETTEXT

Text.s = space(256)
SendMessage_(#StatuSBar, #SB_GETTEXT, Index_Du_Champ, Text)


et SB_GETTEXT = 1026

Publié : mer. 17/mars/2004 16:42
par Le Soldat Inconnu
Merci

Publié : mer. 17/mars/2004 19:24
par nico
J'arrive trop tard,mais je poste quand même:

Code : Tout sélectionner

#SizeWindowX = 300 
#SizeWindowY = 200 

Procedure Open_Window() 
  If OpenWindow(0, 0, 0, #SizeWindowX, #SizeWindowY, #PB_Window_ScreenCentered, "Fenêtre") 
    If CreateGadgetList(WindowID()) 
      TextGadget(1 ,3, #SizeWindowY - 40, #SizeWindowX - 6, 15, "Alt + F4 pour quitter") 
      
      Hstatusbar = CreateStatusBar(2, WindowID()) 
      AddStatusBarField(100) 
      AddStatusBarField(100) 
      StatusBarText(2, 0, "truc") 
      StatusBarText(2, 1, "machin") 
      
      result.l=SendMessage_(hwndStatus, #SB_GETTEXTLENGTH, 0, 0)
      longueur=result&$FFFF
      text$=Space(longueur)
      SendMessage_(Hstatusbar, #SB_GETTEXT, 0,@text$)
      Debug text$
      result.l=SendMessage_(hwndStatus, #SB_GETTEXTLENGTH, 0, 0)
      longueur=result&$FFFF
      text$=Space(longueur)
      SendMessage_(Hstatusbar, #SB_GETTEXT, 0,@text$)
      SendMessage_(Hstatusbar, #SB_GETTEXT, 1,@text$)
      Debug text$

    EndIf 
  EndIf 
EndProcedure 

; Debut du programme 

Open_Window() 

Repeat 
  Event = WaitWindowEvent() 
  
Until Event = #PB_EventCloseWindow 

Publié : ven. 19/mars/2004 8:39
par Le Soldat Inconnu
Ouin, ça marche pas avec l'explorateur window, j'arrive pas à choper le texte de la statusbar. pourtant, j'arrive bien à récupérer le handle de cette statusbar.

je poste un exemple pour illustrer mon prob d'ici peu

Publié : ven. 19/mars/2004 9:46
par Fred
y'a des functions sur les gadgets qui verifient si tu es dans le meme process, pour des raisons de sécurité. C'est peut etre le cas ici ?

Publié : ven. 19/mars/2004 10:13
par Le Soldat Inconnu
ha zut, et je fais comment alors ?

le code pour tester :

Code : Tout sélectionner

Delay(1000)
WindowE = GetForegroundWindow_()


hwndStatus = FindWindowEx_(WindowE, 0,"msctls_statusbar32" , 0)

Texte.s = Space(100) 
SendMessage_(hwndStatus, #SB_GETTEXT, 0, @Texte)
Debug Texte
SendMessage_(hwndStatus, #SB_GETTEXT, 1, @Texte)
Debug Texte
la aussi, ça marche pas pour récupérer le texte de la statusbar avec l'éditeur de pb

Publié : sam. 20/mars/2004 12:25
par Le Soldat Inconnu
bon si personne n'arrive à m'aider pour choper le texte, est-ce que quelqu'un peut m'aider à faire une copie d'image de la statusbar, un peu comme un printscreen sauf que je veux récupérer ce qui est dessiner sur la fenêtre même si c'est pas visible à l'écran. merci

Publié : sam. 20/mars/2004 14:59
par Chris
J'ai essayé de faire ce code pour récupérer les textes des champs:

J'ai le handle de la StatusBar, mais pas moyen de récupérer les textes.

C'est quand même bizarre, cette affaire :(

Code : Tout sélectionner

; Handle de l'explorer
hWnd = FindWindow_("ExploreWClass",#NULL)
If hWnd <> 0
  
  ; Handle de la StatusBar
  hStatus = FindWindowEx_(hWnd, 0,"msctls_statusbar32" , 0)
  
  ; Nombre de champs
  NbParts = SendMessage_(hStatus,#SB_GETPARTS,50,0) ;50 = Nbre maxi de champs. On met ce qu'on veut!
  
  ; Recupération du texte des champs : MARCHE PAS , FAIT Ch..... :)
  For i = 0 To NbParts -1
    lng.l = SendMessage_(hStatus, #SB_GETTEXTLENGTH, i, 0)
    Txt.s = Space(lng)
    SendMessage_(hStatus, #SB_GETTEXT, i,@Txt)
    Debug Txt
  Next
EndIf
Chris :)

Publié : sam. 20/mars/2004 15:59
par Le Soldat Inconnu
ben oui, ça fait ch... comme tu dis dans ton code. Fred a dit qu'il y a avait un truc de sécurité sur certain gadget. si on peut même pas lire le texte, c'est quand même grave, il ont bu quoi chez microchiote ?

qaund on fait #SB_GetText à la place de #Sb_SetText, ça efface la barre d'état. pas mal aussi

Code : Tout sélectionner

Delay(1000)

WindowE = GetForegroundWindow_()

hwndStatus = FindWindowEx_(WindowE, 0, "msctls_statusbar32", 0)

NbField = SendMessage_(hwndStatus, #SB_GETPARTS, 50, 0)

Debug NbField

Texte.s = Space(100)

For n = 0 To NbField - 1
  Debug SendMessage_(hwndStatus, #SB_GETTEXT, n, Texte)
  Debug Texte
Next

Publié : sam. 20/mars/2004 16:11
par Anonyme2
Oui, j'ai testé le code de CHris, on retrouve le handle, le nombre de champs et la longueur du texte de chaque champs, mais pas le texte.

Y protège tout le monsieur MS

Publié : sam. 20/mars/2004 16:40
par Le Soldat Inconnu
la longueur, y'a un truc avec ça :
Return Values

Returns a 32-bit value that consists of two 16-bit values. The low word specifies the length, in characters, of the text. The high word specifies the type of operation used to draw the text. The type can be one of the following values:

Value Description
0 The text is drawn with a border to appear lower than the plane of the window.
SBT_NOBORDERS The text is drawn without borders.
SBT_POPOUT The text is drawn with a border to appear higher than the plane of the window.
SBT_RTLREADING Displays text using right-to-left reading order on Hebrew or Arabic systems.
On fait comment pour décomposer un long en 2 Word ?

Publié : sam. 20/mars/2004 16:49
par Chris
Pour récupérer le HighWord:

Valeur.l >>16&$FFFF

Pour le LowWord

Valeur.l &$FFFF

Exemple :

Code : Tout sélectionner

Valeur.l = 65885265

Low = Valeur&$FFFF : Debug Low
High = Valeur>>16&$FFFF : Debug High
Chris :)

Publié : sam. 20/mars/2004 17:02
par Le Soldat Inconnu
trouver le problème :
CreateStatusWindow
This function creates a status window, which is typically used to display the status of an application. The window generally appears at the bottom of the parent window, and it contains the specified text.

HWND CreateStatusWindow(
LONG style,
LPSTR lpszText,
HWND hwndParent,
WORD wID );
Parameters

style
Window styles for the status window. This parameter must include the WS_CHILD style and should also include the WS_VISIBLE style.
lpszText
Long pointer to a null-terminated string that contains the status text for the first part.
hwndParent
Handle to the parent window.
wID
Control identifier for the status window. The window procedure uses this value to identify messages it sends to the parent window
.
voir ce qui est souligné.

on fait comment pour changer le wID :wink:

Publié : sam. 20/mars/2004 19:26
par Anonyme2
La fonction d'après la doc MS SDK est obsolète et doit être remplacée par CreateWIndow. Cà c'est pour la petite histoire..


Sinon essaye SetWindowLong avec nIndex valant GWL_ID et dwNewLong ayant la nouvelle valeur.

Je ne sais pas si ca va aller.