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

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.