Page 1 sur 3
[Résolu] Capture du texte d'une fenetre externe à PB
Publié : jeu. 07/mars/2013 10:23
par brossden
Bonjour à tous
Mon problème est dans le titre de ma demande, quelqu'un a-t'il une idée pour récupérer le texte d'une fenêtre externe au programme PureBasic sachant que le raccourci "CTRL + A" ne fonctionne pas dans la fenêtre externe !
Merci pour vos idée !
Re: Capture du texte d'une fenetre externe à l'application P
Publié : jeu. 07/mars/2013 13:54
par falsam
Bonjour brossden.
-La fenêtre contenu dans l'application externe est composée de plusieurs champs contenant du texte ?
-La combinaison de touche Ctrl + A fonctionne t'elle si on se trouve sur cette application ?
Re: Capture du texte d'une fenetre externe à l'application P
Publié : jeu. 07/mars/2013 13:59
par brossden
Bonjour Falsam
Non Ctrl + A ne fonctionne pas comme je j'ai annoncé dans mon premier message, la fenêtre que je veux "importer" n'est composée que de texte, par contre je peux sélectionner une zone rectangulaire quelconque et faire CTRL + C qui fonctionne mais ce que je veux faire c'est automatiser cette procédure.
Re: Capture du texte d'une fenetre externe à l'application P
Publié : jeu. 07/mars/2013 15:39
par falsam
Le code va te permette de :
-Chercher le handle de l'application externe en se servant du nom de l’exécutable.
-Trouver la première fenêtre fille de l'application, (Un champs texte par exemple ou un editor).
Ne connaissant pas ton programme j'ai fait un test avec notepad.exe.
Code : Tout sélectionner
;Lire le contenu de la premiere fenetre fille d'une application externe
;Contributeur : Falsam (07 mars 2013)
;
; OS : Windows
Enumeration
#Mainform
EndEnumeration
;Handle de l'application externe
Global ExeHwnd.l
Procedure SearchText(hwnd, lParam)
TextLength = SendMessage_(hwnd, #WM_GETTEXTLENGTH, 0, 0)
text$ = Space(TextLength)
SendMessage_(hwnd, #WM_GETTEXT, TextLength + 1, @text$)
If Trim(Text$) <>""
Debug text$
EndIf
EndProcedure
Procedure.s ProgramfileNameFromWindow(hWnd)
Protected ProcessID, Process32, Snapshot, ProcessEntry.PROCESSENTRY32, ProgramfileName.s
GetWindowThreadProcessId_(hWnd, @ProcessID)
Process32 = OpenLibrary(#PB_Any, "kernel32.dll")
If Process32
Snapshot = CallFunction(Process32, "CreateToolhelp32Snapshot", #TH32CS_SNAPPROCESS, 0)
If Snapshot
CompilerIf #PB_Compiler_Unicode
ProcessEntry\dwSize = SizeOf(PROCESSENTRY32)
If CallFunction(Process32, "Process32FirstW", Snapshot, @ProcessEntry)
Repeat
If ProcessID = ProcessEntry\th32ProcessID
ProgramfileName = PeekS(@ProcessEntry\szExeFile)
Break
EndIf
Until CallFunction(Process32, "Process32NextW", Snapshot, @ProcessEntry) = 0
EndIf
CompilerElse
ProcessEntry\dwSize = SizeOf(PROCESSENTRY32)
If CallFunction(Process32, "Process32First", Snapshot, @ProcessEntry)
Repeat
If ProcessID = ProcessEntry\th32ProcessID
ProgramfileName = PeekS(@ProcessEntry\szExeFile)
Break
EndIf
Until CallFunction(Process32, "Process32Next", Snapshot, @ProcessEntry) = 0
EndIf
CompilerEndIf
CloseHandle_(Snapshot)
EndIf
CloseLibrary(Process32)
EndIf
ProcedureReturn ProgramfileName
EndProcedure
Procedure SearchExternalProgramm(exe.s)
hWnd.l = FindWindow_(0, 0)
While hWnd <> 0
If GetWindowLong_(hWnd, #GWL_STYLE) & #WS_VISIBLE = #WS_VISIBLE ; pour lister que les fenêtres visibles
If LCase(ProgramfileNameFromWindow(hWnd)) = LCase(Exe)
ProcedureReturn hWnd
EndIf
EndIf
hWnd = GetWindow_(hWnd, #GW_HWNDNEXT)
Wend
ProcedureReturn 0
EndProcedure
;Start
Procedure Start()
OpenWindow(#MainForm, 0, 0, 500, 400, "", #PB_Window_SystemMenu)
;Cherche le handle de l'application externe en se servant du nom de l'éxécutable (Exemple pour notepad.exe)
ExeHwnd = SearchExternalProgramm("notepad.exe")
If ExeHwnd
EnumChildWindows_(ExeHwnd, @SearchText(), ExeHwnd)
EndIf
EndProcedure
Start()
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
End
EndSelect
ForEver
Re: Capture du texte d'une fenetre externe à l'application P
Publié : jeu. 07/mars/2013 15:42
par Backup
...
Re: Capture du texte d'une fenetre externe à l'application P
Publié : jeu. 07/mars/2013 16:40
par brossden
Merci Dobro je suis rentré à la maison, mais je teste tes solutions demain et je te donne le résultat, en tout état de chose merci de t'être penché sur mon problème et à charge de revanche dans la mesure de mes possibilités !
Re: Capture du texte d'une fenetre externe à l'application P
Publié : jeu. 07/mars/2013 20:48
par cederavic
Sinon essai de voir du coté de OleAcc . J'avais vu quelques codes sur le forum Anglais.
Re: Capture du texte d'une fenetre externe à l'application P
Publié : ven. 08/mars/2013 13:40
par brossden
Falsam
Merci de ton aide mais comme la fenêtre source est issue d'un émulateur en java je ne connais pas le nom de l'éxecutable ce qui fait que je ne peux pas utiliser ton programme, mais encore une fois merci !
Dobro
Ton "Bidouillage" fonctionne mais j'ai un peu simplifié ton code et par contre simuler le relâchement des touches, pour info je te donne le code que j'utilise un peu plus bas.
Mais je découvre un problème c'est qu'une fois l’exécutable créer sous PB puis lancer comme une appli, le presse-papier est vide alors que dans le testeur d'appli sous PB tout fonctionne bien
Code : Tout sélectionner
#MOUSEEVENTF_MOVE = $1 : #MOUSEEVENTF_ABSOLUTE = $8000 : #MOUSEEVENTF_LEFTDOWN = $2 : #MOUSEEVENTF_LEFTUP = $4
#MOUSEEVENTF_MIDDLEDOWN = $20 : #MOUSEEVENTF_MIDDLEUP = $40 : #MOUSEEVENTF_RIGHTDOWN = $8 : #MOUSEEVENTF_RIGHTUP = $10
Procedure MouseEvent(Ereignis.l)
Mem.l=GlobalAlloc_(0,8)
GetCursorPos_(Mem)
mouse_event_(Ereignis|#MOUSEEVENTF_ABSOLUTE,PeekL(Mem)*($FFFF/GetSystemMetrics_(0)),PeekL(Mem+4)*($FFFF/GetSystemMetrics_(1)),0,GetMessageExtraInfo_())
GlobalFree_(Mem)
EndProcedure
SetCursorPos_(70,90) ; Place le curseur sur démarrer
MouseEvent(#MOUSEEVENTF_LEFTDOWN) ; appuis sur bouton de la souris
SetCursorPos_(1580,950)
MouseEvent(#MOUSEEVENTF_LEFTUP) ; relache le bouton de souris
res = keybd_event_(#VK_CONTROL,0,0,0) ; " Appuyer sur CTRL
res = keybd_event_(#VK_C,0,0,0) ; " Appuyer sur C
res = keybd_event_(#VK_C,0,2,0) ; " Relacher C
res = keybd_event_(#VK_CONTROL,0,2,0) ; " Relacher CTRL
texte.s = GetClipboardText()
End
Re: Capture du texte d'une fenetre externe à l'application P
Publié : ven. 08/mars/2013 14:50
par Backup
brossden a écrit :
Mais je découvre un problème c'est qu'une fois l’exécutable créer sous PB puis lancer comme une appli, le presse-papier est vide alors que dans le testeur d'appli sous PB tout fonctionne bien
[reponse modifié]
il faut commencer la selection sur la zone de text pas en dehors !!

Re: Capture du texte d'une fenetre externe à l'application P
Publié : ven. 08/mars/2013 15:18
par Backup
.....
Re: Capture du texte d'une fenetre externe à l'application P
Publié : ven. 08/mars/2013 15:25
par Backup
...
Re: Capture du texte d'une fenetre externe à l'application P
Publié : ven. 08/mars/2013 15:36
par Backup
...
Re: Capture du texte d'une fenetre externe à l'application P
Publié : ven. 08/mars/2013 15:46
par brossden
Désole Dobro c'est Idem ne fonctionne pas une fois compilé ! (je suis en Windows 7 64 bits)
Il y a un Bug dans PB !
Pkoi cela marche dans l'émulateur et non une fois compilé ??
Re: Capture du texte d'une fenetre externe à l'application P
Publié : ven. 08/mars/2013 17:17
par Backup
oui .. je confirme , c'est louche !
Re: Capture du texte d'une fenetre externe à l'application P
Publié : ven. 08/mars/2013 17:21
par Backup
......