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