[Résolu] Capture du texte d'une fenetre externe à PB
[Résolu] Capture du texte d'une fenetre externe à PB
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 !
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
Bonne Jounée à tous
- 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
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 ?
-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%
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Re: Capture du texte d'une fenetre externe à l'application P
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.
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
Bonne Jounée à tous
- 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
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.
-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%
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Re: Capture du texte d'une fenetre externe à l'application P
...
Dernière modification par Backup le mar. 19/août/2014 10:04, modifié 1 fois.
Re: Capture du texte d'une fenetre externe à l'application P
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
Bonne Jounée à tous
Re: Capture du texte d'une fenetre externe à l'application P
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
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
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
Bonne Jounée à tous
Re: Capture du texte d'une fenetre externe à l'application P
[reponse modifié]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
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.
Re: Capture du texte d'une fenetre externe à l'application P
.....
Dernière modification par Backup le mar. 19/août/2014 10:04, modifié 2 fois.
Re: Capture du texte d'une fenetre externe à l'application P
...
Dernière modification par Backup le mar. 19/août/2014 10:05, modifié 1 fois.
Re: Capture du texte d'une fenetre externe à l'application P
...
Dernière modification par Backup le mar. 19/août/2014 10:05, modifié 1 fois.
Re: Capture du texte d'une fenetre externe à l'application P
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é ??
Il y a un Bug dans PB !
Pkoi cela marche dans l'émulateur et non une fois compilé ??
Denis
Bonne Jounée à tous
Bonne Jounée à tous
Re: Capture du texte d'une fenetre externe à l'application P
oui .. je confirme , c'est louche !
Re: Capture du texte d'une fenetre externe à l'application P
......
Dernière modification par Backup le mar. 19/août/2014 10:05, modifié 1 fois.