[Résolu] Capture du texte d'une fenetre externe à PB

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
brossden
Messages : 833
Inscription : lun. 26/janv./2004 14:37

[Résolu] Capture du texte d'une fenetre externe à PB

Message 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 !
Dernière modification par brossden le mar. 12/mars/2013 15:30, modifié 1 fois.
Denis

Bonne Jounée à tous
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Capture du texte d'une fenetre externe à l'application P

Message 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 ?
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
brossden
Messages : 833
Inscription : lun. 26/janv./2004 14:37

Re: Capture du texte d'une fenetre externe à l'application P

Message 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.
Denis

Bonne Jounée à tous
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Capture du texte d'une fenetre externe à l'application P

Message 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
Dernière modification par falsam le jeu. 07/mars/2013 15:45, modifié 3 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Capture du texte d'une fenetre externe à l'application P

Message par Backup »

...
Dernière modification par Backup le mar. 19/août/2014 10:04, modifié 1 fois.
brossden
Messages : 833
Inscription : lun. 26/janv./2004 14:37

Re: Capture du texte d'une fenetre externe à l'application P

Message 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 !
Denis

Bonne Jounée à tous
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Re: Capture du texte d'une fenetre externe à l'application P

Message par cederavic »

Sinon essai de voir du coté de OleAcc . J'avais vu quelques codes sur le forum Anglais.
brossden
Messages : 833
Inscription : lun. 26/janv./2004 14:37

Re: Capture du texte d'une fenetre externe à l'application P

Message 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


Denis

Bonne Jounée à tous
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Capture du texte d'une fenetre externe à l'application P

Message 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 !! :)
Dernière modification par Backup le ven. 08/mars/2013 15:39, modifié 1 fois.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Capture du texte d'une fenetre externe à l'application P

Message par Backup »

.....
Dernière modification par Backup le mar. 19/août/2014 10:04, modifié 2 fois.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Capture du texte d'une fenetre externe à l'application P

Message par Backup »

...
Dernière modification par Backup le mar. 19/août/2014 10:05, modifié 1 fois.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Capture du texte d'une fenetre externe à l'application P

Message par Backup »

...
Dernière modification par Backup le mar. 19/août/2014 10:05, modifié 1 fois.
brossden
Messages : 833
Inscription : lun. 26/janv./2004 14:37

Re: Capture du texte d'une fenetre externe à l'application P

Message 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é ??
Denis

Bonne Jounée à tous
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Capture du texte d'une fenetre externe à l'application P

Message par Backup »

oui .. je confirme , c'est louche !
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Capture du texte d'une fenetre externe à l'application P

Message par Backup »

......
Dernière modification par Backup le mar. 19/août/2014 10:05, modifié 1 fois.
Répondre