Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | Calendrier |
|
|
| Fonctions d'envoyer de touches à un objet interne ou externe | |
| | |
Auteur | Message |
---|
Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Dim 9 Sep 2012 - 23:45 | |
| @ KlausJe me suis un peu amusé avec ton code et je me suis fait un petit outils de plus... - Code:
-
' ------------------------------------------------------------------------------ dim D$,x%,M%,sep%,L$,L% dim s$, res%, hnd%, hnd0%, titre$ ' ------------------------------------------------------------------------------ label Init,Close0,Menu,F100,F200,Enregistrer,Supprimer,Quitter label Init_F100,couleur104,Init_F200,Change202,Connection ' ------------------------------------------------------------------------------ dll_on "KGF.dll" ' ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ width 0,250:height 0,360:top 0,100:left 0,100:on_close 0,Close0 font_name 0,"Times new roman":font_size 0,10:Caption 0,"Connect to MyDrive" hnd0% = handle(0)
main_menu 1 sub_menu 2:parent 2,1:caption 2,"Fichier" sub_menu 3:parent 3,2:caption 3,"Quitter" sub_menu 4:parent 4,1:caption 4,"Edit" sub_menu 5:parent 5,4:caption 5," Ajouter " sub_menu 6:parent 6,4:caption 6," Supprimer " for x%=2 to 6:on_click x% ,Menu:next x% list 7:width 7,234:height 7,270:cursor_point 7:on_double_click 7,Connection
alpha 8:top 8,275:left 8,25 font_color 8,0,0,255:caption 8,"Double click pour sélectionner"
dlist 9
gosub Init end ' ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ Init: D$=Dir_current$ if file_exists(D$+"\Connect.Bdd")=1 clear 9 :clear 7 file_load 9,D$+"\Connect.Bdd" for x%=1 to count(9) L$=item_read$(9,x%) sep%=instr(L$,";") item_add 7,left$(L$,sep%-1) next x% else file_open_write 10,D$+"\Connect.Bdd":file_close 10 end_if return ' ------------------------------------------------------------------------------ Menu: for x%=2 to 6 if clicked(x%)=1 then M%=x% next x% select M% case 2 case 3 gosub Close0 gosub Quitter case 4 case 5 gosub F100 case 6 gosub F200 end_select return ' ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ F100: if object_exists(100)=1 Show 100 else form 100:width 100,250:height 100,160 Font_name 100,"Times new roman":font_size 100,10:caption 100,"Ajouter un compte" command_target_is 100 alpha 101 :top 101,10:left 101,10:caption 101,"Login :" edit 103 :top 103,28:left 103,10:width 103,150 alpha 102 :top 102,50:left 102,10:caption 102,"Mot de passe :" edit 104 :top 104,68:left 104,10:on_change 104,couleur104 button 105:top 105,95:left 105,155:caption 105,"Enregistrer":cursor_point 105 on_click 105,Enregistrer end_if gosub Init_F100 return ' ------------------------------------------------------------------------------ Init_F100: text 103,"" text 104,"panoramic123":font_color 104,210,210,210 return ' ------------------------------------------------------------------------------ couleur104: font_color 104,0,0,0 return ' ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ F200: if object_exists(200)=1 Show 200 else form 200:width 200,250:height 200,120 Font_name 200,"Times new roman":font_size 200,10:caption 200,"Supprimer un compte" command_target_is 200 alpha 201 :top 201,10:left 201,10:caption 201,"Compte" combo 202 :top 202,28:left 202,10:width 202,150:on_change 202,Change202 button 203:top 203,55:left 203,155:caption 203,"Supprimer":cursor_point 203 on_click 203,Supprimer end_if gosub Init_F200 return ' ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ Init_F200: Clear 202 for x%=1 to count(9) L$=item_read$(9,x%) sep%=instr(L$,";") item_add 202,left$(L$,sep%-1) next x% return ' ------------------------------------------------------------------------------ Change202: L%=item_index(202) return ' ------------------------------------------------------------------------------ Enregistrer: item_add 9,trim$(text$(103))+";"+trim$(text$(104)) file_save 9,D$+"\Connect.Bdd" gosub Init gosub Init_F100 return ' ------------------------------------------------------------------------------ Supprimer: item_delete 9,L% file_save 9,D$+"\Connect.Bdd" gosub Init_F200 gosub Init return ' ------------------------------------------------------------------------------ Connection: hide 0 Execute "http://www.mydrive.ch/login" repeat pause 1000 titre$ = string$(255," ") hnd% = dll_call1("GetActiveWindowTitle",adr(titre$)) titre$ = trim$(titre$) until instr(titre$, "Login |" )>0 pause 1000 hide 0 pause 1000 titre$ = string$(255," ") hnd% = dll_call1("GetActiveWindowTitle",adr(titre$)) if instr(titre$, "Login |" )=0 show 0 message "Il faut d'abord cliquer sur [MyDrive] !" message "Le titre actuel est: ["+titre$+"]" return end_if s$ = item_index$(7) hnd% = dll_call0("GetActiveControl") res% = dll_call2("SendStringAsText",hnd%,adr(s$)) s$ = chr$(9) res% = dll_call2("SendStringAsText",hnd%,adr(s$)) pause 1000 s$ = item_read$(9,item_index(7)) sep%=instr(s$,";") s$=right$(s$,len(s$)-sep%) res% = dll_call2("SendStringAsText",hnd%,adr(s$)) pause 1000 s$ = chr$(9) res% = dll_call2("SendStringAsText",hnd%,adr(s$)) res% = dll_call2("SendStringAsText",hnd%,adr(s$)) res% = dll_call2("SendStringAsText",hnd%,adr(s$)) s$ = chr$(13) res% = dll_call2("SendStringAsText",hnd%,adr(s$)) pause 1000 show 0 return ' ------------------------------------------------------------------------------ Close0: dll_off return ' ------------------------------------------------------------------------------ Quitter: terminate | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Fonctions d'envoyer de touches à un objet interne ou externe Dim 9 Sep 2012 - 23:52 | |
| @Ygeronimi: Impeccable !
@Jicehel: C'était le but ! Entre les fonction de gestion de la souris et celles d'envoi de caractères, le but était de pouvoir piloter d'autres applications. Et, pourquoi pas, Word ou un autre traitement de texte, un tableur (Excel, ...). On peut aussi imaginer un programme de démonstrationi, qui, avec les poses appropriées, pilote un autre en donnant les explications de vive voix, par les fonctions SAPI ! Une vraie mise en scène !
| |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Fonctions d'envoyer de touches à un objet interne ou externe Lun 10 Sep 2012 - 0:22 | |
| Bon, le SAPI c'est un peu le chantier sous W7, donc je ne creuserait pas dans cette voix même si j'étais le premier à te le demander à l'époque... Moi je m'y perd un peu dans le bazard du SAPI 32 / 64 sous W7. Par contre exactement, faire des programmes de démos, des programmes de test, des automates, ça laisse un champ d'action énorme. Je vois 2 parties dans le programme. Une partie "enregistrement de séquence" où l'on mémorise les actions (Nom des fenêtres pour récupérer les handle, localisations des clics et des textes à saisir) puis un "player" qui relise et exécute les actions enregistrées et éventuellement enrichies ou simplifiées. | |
| | | bignono
Nombre de messages : 1127 Age : 67 Localisation : Val de Marne Date d'inscription : 13/11/2011
| Sujet: Re: Fonctions d'envoyer de touches à un objet interne ou externe Lun 10 Sep 2012 - 0:23 | |
| @Klaus, J'y suis quand même arrivé à lancer turbosquid avec login et mot de passe, grâce à ta dernière fonction de KGF.dll! Depuis ce matin, je me battais avec ça. Enfin le principal c'est d'y arriver et de comprendre! Merci beaucoup à toi Klaus! @ygeronimi, J'avais l'intention de faire le même outil que toi pour lancer les comptes mydrive automatiquement. Tu m'as coupé l'herbe sous les pieds! N'empèche que c'est bien pratique comme programme! C'est super ce que tu fais! @+ et bonne nuit à tous. | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Lun 10 Sep 2012 - 0:26 | |
| @ bignono, Désolé il reste un truc que l'on peut ajouter, c'est le multi-site en créant une base par site... ou en ajoutant le site dans la base...
Dernière édition par ygeronimi le Lun 10 Sep 2012 - 0:28, édité 1 fois | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Fonctions d'envoyer de touches à un objet interne ou externe Lun 10 Sep 2012 - 0:27 | |
| Intéressant, Jicehel. Il y a sûrement quelque chose à creuser, là. Petite info complémentaire pour la nouvelle fonction GetFomMetrics. Elle marche non seulement pour une form ou un programme externe, mais elle marche pour TOUT ce qui est visuel et qui a un handle ! Cela marche pour un mémo, par exemple ! Le programme de démo suivant place une form 0 sur l'écran et décalé, puis un mémo dans la form. Puis, on applique cette fonction, d'abord sur la form 0, puis sur le mémo 10. Et on a les infos exactes en pixels absolus de l'écran, pour les deux objets: - Code:
-
' test_GetFormMetrics.bas
dim x%, y%, w%, h%, hnd%, res%
dll_on "KGF.dll"
top 0,200 : left 0,300
memo 10 : top 10,30 : left 10,20
hnd% = handle(0) res% = dll_call5("GetFormMetrics",hnd%,adr(x%),adr(y%),adr(w%),adr(h%)) message "Form 0: x,y,w,h="+str$(x%)+","+str$(y%)+","+str$(w%)+","+str$(h%)
hnd% = handle(10) res% = dll_call5("GetFormMetrics",hnd%,adr(x%),adr(y%),adr(w%),adr(h%)) message "Memo 10: x,y,w,h="+str$(x%)+","+str$(y%)+","+str$(w%)+","+str$(h%)
end
| |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Fonctions d'envoyer de touches à un objet interne ou externe Lun 10 Sep 2012 - 1:03 | |
| On peut même aller plus loin ! A l'aide d'un timer, on peut surveiller une autre form, connaître en temps réel sa position et sa taille ! Voici le même programme, avec les deux affichages comme précédemment. Puis, le programme se cache, lance le NotePad, récupère son handle et se montre à nouveau, en affichant dans la caption de la form 0 la position et les dimensions du NotePad. Maintenant, à l'aide de la souris, déplacez le NotePad, ou redimensionnez-le. La caption de la form 0 trace cela en temps réel ! Une belle surveillance, non ? Voici le code: - Code:
-
' test_GetFormMetrics.bas
label tick
dim x%, y%, w%, h%, hnd%, res%, titre$
dll_on "KGF.dll"
top 0,200 : left 0,300
memo 10 : top 10,30 : left 10,20
hnd% = handle(0) res% = dll_call5("GetFormMetrics",hnd%,adr(x%),adr(y%),adr(w%),adr(h%)) message "Form 0: x,y,w,h="+str$(x%)+","+str$(y%)+","+str$(w%)+","+str$(h%)
hnd% = handle(10) res% = dll_call5("GetFormMetrics",hnd%,adr(x%),adr(y%),adr(w%),adr(h%)) message "Memo 10: x,y,w,h="+str$(x%)+","+str$(y%)+","+str$(w%)+","+str$(h%)
hide 0 execute "Notepad.exe" repeat wait 500 titre$ = string$(255," ") hnd% = dll_call1("GetActiveWindowTitle",adr(titre$)) titre$ = trim$(titre$) until instr(titre$, "Sans titre" )>0 timer 5 : timer_interval 5,100 : on_timer 5,tick show 0 end
tick: res% = dll_call5("GetFormMetrics",hnd%,adr(x%),adr(y%),adr(w%),adr(h%)) caption 0,"Notepad: x,y,w,h="+str$(x%)+","+str$(y%)+","+str$(w%)+","+str$(h%) return
| |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Lun 10 Sep 2012 - 2:21 | |
| @ klaus, Excuse moi, mais je reviens sur "connexion_mydrive". Pourrais tu documenter ta démarche ( un explique couillon ) dans ton code tu envoies s$ dans un premier temps il contient le login dans un deuxième temps une chaine vide "chr$(9)" puis le mot de passe et enfin 3 fois une chaine vide puis pour finir la touche "entrée" par "chr$(13)" | |
| | | Invité Invité
| Sujet: Re: Fonctions d'envoyer de touches à un objet interne ou externe Lun 10 Sep 2012 - 2:49 | |
| Je ne t'ai pas encore remercié Klaus. Je suis content que tu ais pu faire cette DLL. Les gens semblait septique au départ. Et je vois qu'enfin tout le monde voit l'intéret de ces fonctions. Je savais le faire en AutoIt, et je savais qu'on passait à côté de bien des choses sans ces fonctions en Panoramic. Je n'ai pas regardé, mais je sais pas comment on peut savoir si on est connecté ou non à internet. Dès que je quitte le post, j'appuie sur un bouton qui me ferme le navigateur et internet. Et j'ai un autre bouton qui lance les deux. Mais je me suis toujours posé la question de savoir comment par programme on est connecté ou non. On le voit visuellement, mais comment le savoir par programme? Cela peut-être utile pour un scanner qui marche sous wifi. On s'est croisé Ygenomini. chr$(9), c'est la touche TAB, pour changer d'edit. |
| | | Invité Invité
| Sujet: Re: Fonctions d'envoyer de touches à un objet interne ou externe Lun 10 Sep 2012 - 3:04 | |
| le premier chr$(9): c'est pour changer d'edit en appuyant sur la touche <TAB> ensuite en étant sur l'edit du dessous, tu mets le mot de passe. Les 3 autres touches ne sont pas des espaces, mais touche <TAB> pour sauter le cases à cocher, et te retrouver sur login. Ensuite tu appuies sur <enter> pour cliquer sur login. |
| | | bignono
Nombre de messages : 1127 Age : 67 Localisation : Val de Marne Date d'inscription : 13/11/2011
| Sujet: Re: Fonctions d'envoyer de touches à un objet interne ou externe Lun 10 Sep 2012 - 9:04 | |
| Bonjour Klaus , C'est vraiment formidable ta dernière fonction de KGF.dll et je t'en remercie. Bon, maintenant sans abuser de ta gentillesse, y-a-t-il moyen de redimensionner une form en envoyant des valeurs left, top, width et height. Supposons, que j'ouvre avec mon lanceur Turbosquid, puis avec ta dll je simule le clic pour maximiser ma fenêtre, je simule le clic sur le login, je simule l'entrée de mon login, je simule le TAB, je simule le mot de passe, le simule le TAB et je simule l'entrée des paramètres pour ouvrir le compte. Après cela, je désire redimensionner la fenêtre en la mettant par exemple à droite de mon écran avec un left à 800, un top à 0, un width à 800 et un height à 600 par exemple. Voilà, merci d'avance de ta réponse. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Fonctions d'envoyer de touches à un objet interne ou externe Lun 10 Sep 2012 - 9:55 | |
| @YGeronimi: Voici une version commentée du programme: - Code:
-
' connexion_MyDrive.bas
label MyDrive, choix, close0, TurboSquid dim s$, res%, hnd%, hnd0%, titre$, x%, y% dim tp%,lft%,wdt%,hgt%
dll_on "KGF.dll"
width 0,440 : height 0,280 : on_close 0,close0
list 1 : height 1,200 : width 1,400 on_click 1,choix dlist 3 : ' mots de passe item_add 1,"panoramic@cosmos70" item_add 3,"panoramic123"
item_add 1,"panoramic@klausgunther" item_add 3,"panoramic123"
item_add 1,"panoramic@papydall" item_add 3,"panoramic123"
item_add 1,"panoramic@bignono" item_add 3,"panoramic123"
item_add 1,"panoramic@jicehel" item_add 3,"panoramic123"
item_add 1,"panoramic@ygeronimi" item_add 3,"panoramic123"
item_add 1,"panoramic@nardo26" item_add 3,"panoramic123" item_add 1,"turbosquid1" item_add 3,"turbosquid123"
button 2 : top 2,210 : left 2,10 caption 2,"MyDrive" : on_click 2,MyDrive button 4 : top 4,210 : left 4,110 caption 4,"TurboSquid" : on_click 4,TurboSquid
' uniquement pour avoir un handle valide ' ce handle ne sera pas utilisé hnd0% = handle(0)
end
close0: : ' on ferme le programme, alors dll_off : ' assurer que la DLL disparaisse bien de la mémoire return
' ************** sélection des sites Web ' le principe: on charge une URL dans le browser par défaut, ' puis on attent la fin du chargement de la page avant de continuer. ' Dans tous les browsers, le titre de la fenêtre (caption) contient ' un texte en lien avec le titre de la page chargée. On attend donc ' que le titre reflète le critère attendu.
' Connexion à MyDrive MyDrive: ' on cache ce programme. De cette manière, lorsque l'URL se chargera, ' le browser deviendra la fenêtre active, celle qui est en avan-plan. hide 0 ' charger la URL de la page login dans le browser par défaut Execute "http://www.mydrive.ch/login" repeat : ' attendre le chargement de la page web ' donner un peu de temps pause 1000 ' préparer de l'espace pour recevoir le titre de la fenêtre du browser titre$ = string$(255," ") ' charger le titre et le handle de la fenêtre du browser hnd% = dll_call1("GetActiveWindowTitle",adr(titre$)) ' on enlève des espaces inutiles titre$ = trim$(titre$) ' et on vérifie que c'est bien le bon critère until instr(titre$, "Login |" )>0 ' on fait maintenant réapparaître ce programme pour pouvoir choisir le login show 0 return
' Connexion à TurboSquid TurboSquid: ' on cache ce programme. De cette manière, lorsque l'URL se chargera, ' le browser deviendra la fenêtre active, celle qui est en avan-plan. hide 0 ' charger la URL de la page login dans le browser par défaut Execute "http://www.turbosquid.com/" repeat ' donner un peu de temps pause 1000 ' préparer de l'espace pour recevoir le titre de la fenêtre du browser titre$ = string$(255," ") ' charger le titre et le handle de la fenêtre du browser hnd% = dll_call1("GetActiveWindowTitle",adr(titre$)) ' on enlève des espaces inutiles titre$ = trim$(titre$) ' et on vérifie que c'est bien le bon critère until instr(titre$, "at TurboSquid" )>0 ' on fait maintenant réapparaître ce programme pour pouvoir choisir le login show 0 return
' ************** la procédure de login ' un clic dans la liste a sélectionné un identifiant. ' On va tenter de faire un login avec cet identifiant ' et le mot de passe dans la DLIST 3, à la même ligne. ' Pour cela, on recharge le handle et le titre de la fenêtre du browser ' et on en déduit le site dont la page a été chargée? choix: ' on cache ce programme. Le Browser redevient la fenêtre active. hide 0 ' donner on peu de temps (on peut certainement réduire ici) pause 1000 ' préparer de l'espace pour recevoir le titre de la fenêtre du browser titre$ = string$(255," ") ' charger le titre et le handle de la fenêtre du browser hnd% = dll_call1("GetActiveWindowTitle",adr(titre$)) ' on enlève des espaces inutiles titre$ = trim$(titre$)
' tester le critère "MyDrive" if instr(titre$, "Login |" )>0 ' sur ce sitel la zone de saisie de l'identifiant a le focus ' directement au chargement de la page. On n'a donc pas besoin ' d'effectuer des actions particulières pour se positionner. ' prendre l'identifiant sélectionné s$ = item_index$(1) ' trouver le handle de l'objet ayant le focus ' cette zone est le champ de saisie de l'identifiant hnd% = dll_call0("GetActiveControl") ' envoyer l'identifiant res% = dll_call2("SendStringAsText",hnd%,adr(s$)) ' préparer le caractère TAB s$ = chr$(9) ' envoyer le TAB ==> on passe au champ de saisie du mot de passe res% = dll_call2("SendStringAsText",hnd%,adr(s$)) ' donner un peu de temps pause 500 ' prendre le mot de passe s$ = item_read$(3, item_index(1)) ' envoyer le mot de passe res% = dll_call2("SendStringAsText",hnd%,adr(s$)) ' donner un peu de temps pause 1000 ' envoyer l'identifiant s$ = chr$(9) ' envoyer 3 fois le caractère TAB ==> on passe sur le bouton Connexion res% = dll_call2("SendStringAsText",hnd%,adr(s$)) res% = dll_call2("SendStringAsText",hnd%,adr(s$)) res% = dll_call2("SendStringAsText",hnd%,adr(s$)) ' préparer un retour charriot s$ = chr$(13) ' envoyer le retour charriot ==> ceci déclenche la procédure de login ! res% = dll_call2("SendStringAsText",hnd%,adr(s$)) ' donner un peu de temps pause 1000 ' faire réapparaître ce programme show 0 return end_if ' tester le critère "TurboSquid" if instr(titre$, "at TurboSquid" )>0 ' la particularité de ce site, c'est qu'il faut activer un lien ' dans la page d'accueil afin de faire apapraître un cadre Java Script ' aui fait le véritable login. Or, ce cadre n'est pas accessible ' simplement avec des tabulations. Il faut effectuer un clic dans ' ce cadre avant de pouvoir utiliser les tabulations. ' Alors, on envoie des tabulations ' jusqu'à activation du lien provoquant l'aparition du cadre de login s$ = chr$(9) res% = dll_call2("SendStringAsText",hnd%,adr(s$)) res% = dll_call2("SendStringAsText",hnd%,adr(s$)) res% = dll_call2("SendStringAsText",hnd%,adr(s$)) res% = dll_call2("SendStringAsText",hnd%,adr(s$)) ' on envoie un retour charriot pour faire apparître le cadre du login s$ = chr$(13) res% = dll_call2("SendStringAsText",hnd%,adr(s$)) pause 1000 ' le cadre du login est centré dans la fenêtre du browser. ' Si celui-ci est maximisé, c'est facile. Mais s'il est en taille rédite ' et éventuellement décalé, il faut connaître sa position et ses ' dimensions, pour pouvoir en déduire la position du cadre du login. ' Alors, on charge la position et les dimensions de la fenêtre du bowser. res% = dll_call5("GetFormMetrics",hnd%,adr(lft%),adr(tp%),adr(wdt%),adr(hgt%)) ' on se place horizontalement exactement au milieu x% = lft% + wdt%/2 ' et verticalement à environ un tiers de la hauteur de la fenetre y% = tp% + hgt%/3 ' et on fait un clic gauche à cet endroit. ' Il est censé toucher le cadre de login. res% = dll_call2("AbsoluteMouseLeftClick",x%,y%) pause 500 ' on envoie des tabulations pour se trouver ' sur la zone de saisie de l'identifiant s$ = chr$(9) res% = dll_call2("SendStringAsText",hnd%,adr(s$)) res% = dll_call2("SendStringAsText",hnd%,adr(s$)) pause 1000 ' on envoie l'identifiant s$ = item_index$(1) : ' identifiant res% = dll_call2("SendStringAsText",hnd%,adr(s$)) pause 1000 ' une tabulation pour aller sur la zone de saisie du mot de passe s$ = chr$(9) res% = dll_call2("SendStringAsText",hnd%,adr(s$)) ' on envoie le mot de passe s$ = item_read$(3, item_index(1)) : ' mot de passe res% = dll_call2("SendStringAsText",hnd%,adr(s$)) ' deux tabulations pour aller sur le bouton de validation s$ = chr$(9) res% = dll_call2("SendStringAsText",hnd%,adr(s$)) res% = dll_call2("SendStringAsText",hnd%,adr(s$)) ' on valide le login par envoi de retour charriot s$ = chr$(13) res% = dll_call2("SendStringAsText",hnd%,adr(s$)) pause 500 ' et on fait réapparaître ce programme show 0 return end_if ' en arrivant ici, on sait qu'on n'a trouvé aucun site identifiable. ' alors faire réapparaitre le programme show 0 ' et signaler l'anomalie message "Il faut d'abord cliquer sur [MyDrive] ou [TurboSquid] !" message "Le titre actuel est: ["+titre$+"]" return
| |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Lun 10 Sep 2012 - 13:22 | |
| @ Cosmos70 & @ Klaus,
Merci à vous deux pour vos explications, je comprends maintenant les <tab> ou ch$(9)
Je sais que je suis parfois le premier à oublier d'expliquer ma démarche dans mes programmes mais parfois et surtout, là, où on travaille presque sur deux langages différents ( prog panoramique =>page html ) c'est important car tout de suite nos esprit sont dans une logique dans laquelle ils ne seront plus d'ici quelques jours ou mois.
Encore Merci à vous deux. | |
| | | Invité Invité
| Sujet: Re: Fonctions d'envoyer de touches à un objet interne ou externe Lun 10 Sep 2012 - 13:43 | |
| Bonjour, Klaus: Je pense que tu devrais mettre systématiquement quand tu postes maintenant le nom de la dernière version de KGF, comme tu peux mettre plusieurs fois par jour une nouvelle version.
J'ai essayé de gardé le dernier scripte avec les explications, pour m'en servir plus tard, et une fois MyDrive ouverte, impossible de la mettre devant. J'ai voulu voir si j'avais la dernière version de Kgf pour être à jour, et finalement je ne sais pas.
Où chose que je ne connais pas bien, une signature. Comme cela d'un post à un autre, on sait si le problème vient du programme, ou de la version qui n'est pas à jour. |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Fonctions d'envoyer de touches à un objet interne ou externe Lun 10 Sep 2012 - 13:57 | |
| Normalement Klaus mets un check version en début de source et mets un message d'erreur si la version de la DLL utilisée est inférieure à celle en cours. | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Lun 10 Sep 2012 - 14:20 | |
| ...en voilà un truc qui est pas bête ! tu viens de me donner une idée pour mes prochains prog avec KGF mais çà va finir par faire de sacrés "Init"... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Fonctions d'envoyer de touches à un objet interne ou externe Lun 10 Sep 2012 - 15:00 | |
| Nouvelle version V1.56 du 10/09/2012 Ajout fonction ChangeWindowSize Pourquoi ? comme on a pu le constater avec le login dans le site TurboSquid, certains sites ouvrent un cadre en JavaScript qui n'est pas directement accessible par des tabulations. Il faut effectuer un clic dans une partie non utilisée de ce cadre puis faire les tabulations nécessaires, ou alors cliquer directement dans le champ de saisie pour l'identifiant. Or, cela impose de connaître exactement la position et la taille de ces objets à l'écran. Chez moi, le browser est systématiquement maximisé ce qui simplifie le problème. Mais à l'évidence, ce n'est pas le cas chez tout le monde, et le browser peut avoir n'importe quelle taille et être localisé n'importe où dans l'écran. J'ai trouvé un moyen de résoudre le problème pour TurboSquid, en récupérant dimension et position de la fenêtre du browser, et j'en déduits les coordonnées d'un clic. Mais c'est tout de même un peu aléatoire. J'ai donc ajouté une nouvelle fonction ChangeWindowSize à la DLL. Cette fonction a le format suivant: - Code:
-
res% = DLL_call6("ChangeWindowSize",hnd%,fonction%,gauche%,haut%,largeur%,hauteur%) Le code fonction peut prendre les valeurs suivantes: 0 = maximiser la fenêtre 1 = placer la fenêtre en (gauche%,haut%) 2 = centrer la fenêtre à l'écran 3 = placer la fenêtre en (haut%,gauche%) et imposer les dimensions largeur% et hauteur% 4 = centrer la fenêtre à l'écran et imposer les dimensions largeur% et hauteur% On peut alors utiliser le code fonction 0 pour forcer le browser d'occuper tout l'écran, et le ciblage de la zone recherchée devient plus facile, car sa position ne dépendra plus, ni de la taille de la fenêtre, ni de sa posotion à l'écran. Voici un petit programme de démo qui a un bouton pour chacune de ces fonctions, plus un bouton pour lancer le NotePad. Utilisez ce bouton pour le lancer, attendez qu'il apparaisse, puis utilisez l'un ou l'autre des boutons de fonction pour agir sur le notepad. C'est comme si l'on utilisait les commandes LEFT, TOP, WIDTH, HEIGHT et FULL_SPACE sur la fenêtre ciblée, ici le NotePad. - Code:
-
' test_ChangeWindowSize.bas
label start, maximiser, placer, centrer, placerdimensionner, centrerdimensionner
dim res%, x%, y%, w%, h%, hnd%
dll_on "KGF.dll"
hnd% = handle(0) width 0,180 : height 0,240
button 1 : top 1,10 : left 1,10 : width 1,150 caption 1,"Start Notepad" : on_click 1,start button 10 : top 10,40 : left 10,10 : width 10,150 caption 10,"Maximiser" : on_click 10,maximiser
button 11 : top 11,70 : left 11,10 : width 11,150 caption 11,"Placer" : on_click 11,placer
button 12 : top 12,100 : left 12,10 : width 12,150 caption 12,"Centrer" : on_click 12,centrer
button 13 : top 13,130 : left 13,10 : width 13,150 caption 13,"Placer et dimensionner" : on_click 13,placerdimensionner
button 14 : top 14,160 : left 14,10 : width 14,150 caption 14,"Centrer et dimensionner" : on_click 14,centrerdimensionner
' res% = dll_call6("ChangeWindowSize",hnd%,0,0,0,0,0)
end
start: execute "NotePad.exe" return maximiser: hide 0 hnd% = dll_call0("GetActiveWindow") res% = dll_call6("ChangeWindowSize",hnd%,0,0,0,0,0) show 0 return placer: hide 0 hnd% = dll_call0("GetActiveWindow") res% = dll_call6("ChangeWindowSize",hnd%,1,200,10,0,0) show 0 return
centrer: hide 0 hnd% = dll_call0("GetActiveWindow") res% = dll_call6("ChangeWindowSize",hnd%,2,0,0,0,0) show 0 return
placerdimensionner: hide 0 hnd% = dll_call0("GetActiveWindow") res% = dll_call6("ChangeWindowSize",hnd%,3,200,10,200,300) show 0 return
centrerdimensionner: hide 0 hnd% = dll_call0("GetActiveWindow") res% = dll_call6("ChangeWindowSize",hnd%,4,0,0,200,300) show 0 return
| |
| | | Invité Invité
| Sujet: Re: Fonctions d'envoyer de touches à un objet interne ou externe Lun 10 Sep 2012 - 15:50 | |
| Merci pour ton travail.
Une chose, et ça n'a rien à voir avec Kgf. Avec Autoit, pour ouvrir MyDrive, j'ai changé de principe. Normalement j'utilise Run qui est similaire à execute. Enfin il y a différent run, mais la j'ai utilisé: ShellExecuteWait("http://www.mydrive.ch/login") Avec Panoramic, même si pour moi, QtWeb est ouvert, avec execute systématiquement, il m'ouvre un 2ème browser. Si je pouvais avoir une commande de lancement qui ouvrirait un onglet en plus, ce serait mieux que cette commande execute, qui veut m'ouvrir autre chose.
Su tu en as le temps, et dans tes possibilité, tu le mets dans ta to_list. Il y a vraiment pas urgence. Merci. Si Jack un jour peut le faire, cela lui laissera le temps.
EDIT: Tu diras: il y a toujours la possibilité de faire un clic pour ouvrir un nouvel onglet. C'est idiot avec ALT CTRL D on peut ouvrir un onglet. C'est vrai ensuite il faut atteindre l'adresse pour y mettre celle d'un site voulu. Je verrai cela dans un certain temps. |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Fonctions d'envoyer de touches à un objet interne ou externe Lun 10 Sep 2012 - 17:24 | |
| Je vais étudier la question. | |
| | | bignono
Nombre de messages : 1127 Age : 67 Localisation : Val de Marne Date d'inscription : 13/11/2011
| Sujet: Re: Fonctions d'envoyer de touches à un objet interne ou externe Lun 10 Sep 2012 - 17:42 | |
| Bonjour Klaus, Alors là, ta dernière fonction, c'est du tonnerre! On peut placer la fenètre que l'on a ouverte où l'on veut et comme on veut! J'ai fait plein de test et ça fonctionne super! En plus avec ton petit programme de démo, c'est nickel! On comprend tout de suite comment utiliser la fonction. Par contre les paramètres c'est : res% = DLL_call6("ChangeWindowSize",hnd%,fonction%,haut%,gauche%,hauteur%,largeur%) haut et gauche ainsi que hauteur et largeur sont inversé chez moi par rappoirt à ce que tu annonçais dans le post précédent. Enfin, je suis ravi! Merci encore pour tout ce que tu fais pour la communauté Panoramic! A+ | |
| | | pan59
Nombre de messages : 367 Age : 67 Localisation : Wattignies Date d'inscription : 16/10/2011
| Sujet: Pour Klaus. Lun 10 Sep 2012 - 18:16 | |
| Bonjour.
Dans le post précédent, je remarque qu'il est possible de passer des paramètres par valeur à une DLL, et non par adr ().
Cela me serait d'une grande aide.
Merci de m'apporter plus de précisions. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Fonctions d'envoyer de touches à un objet interne ou externe Lun 10 Sep 2012 - 19:19 | |
| @Bignono: Merci pour les fleurs ! Ca fait plaisir !
J'ai modifié la doc pour que cela reflète ce que tu dis - tu as évidemment raison !
@Pan59: Ce qu'on peut passer à une DLL, c'est simplement une valeur entière de type INTEGER, et "par valeur". C'est la fonction dans la DLL qui doit savoir comment traiter la valeur qu'on lui passe. Rien ne lui indique le type de valeur passée. Ceci a les conséquences suivantes:
1. si la DLL attend une valeur de type INTEGER ==> on passe simplement cette valeur, sous forme de constante, variable integer ou résultat d'une expression.
2. si la DLL attent une chaîne de caractères, alors là, problème. On ne peut en aucun cas passer une chaîne de caractères. Alors, on utilise la fonction ADR() de Panoramic, qui retourne une valeur integer représentant l'adresse en mémoire de la variable qu'on lui passe en paramètre. Et c'est cette valeur qu'un passe à la fonction DLL. Et la fonction DLL doit savoir que pour ce paramètre, ce sera TOUJOURS une adresse d'une chaîne de caractères, et doit prendre les mesures nécessaires pour aller chercher les caractères de la chaîne à partir de l'adresse spécifiée.
3. si la DLL veut retourner une valeur via un paramètre, alors là, problème. Tous les paramètres sont passés "par valeur" et sont donc par définition non modifiables. Là encore, on utilise la fonction ADR() pour passer l'adresse d'une variable de type integer. Et c'est la routine DLL qui doit gérer cela et placer le résultat, non pas directement dans le paramètre, mais dans l'adresse mémoire indiquée par le paramètre.
4. si la DLL veut retourner une chaîne de caractères, alors là, très gros problème ! Tu sais déjà qu'on ne peut pas passer directement une chaîne, ni retourner directement une valeur ! Là encore, on passe par la fonction ADR() pour passer l'adresse d'une chaîne de caractères Panoramic à la DLL. Et la fonction DLL doit copier les caractères dans la mémoire à partir de l'adresse passée en paramètre. Mais attention: il faut que la chaîne de caractères recevant le texte existe et soit suffisamment longue pour recevoir tout ce qu'il faut y copier, sous peine d'écraser autre chose et de provoquer un crash, une violation de mémoire etc. Il faut donc IMPERATIVEMENT faire s$=string$(longueur maxi," "), puis passer adr(s$), puis faire trim$(s$) pour enlever les espaces en trop.
Donc, tu vois, ce n'est pas si simple que ça. Ce sont les exigences techniques de la fonction DLL qui déterminent si l'on passe un entier ou l'adresse d'une variable, et comment il faut la gérer en Panoramic avant et après l'appel. On ne peut pas choisir soi-même le mode de passage de paramètres. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Fonctions d'envoyer de touches à un objet interne ou externe Lun 10 Sep 2012 - 19:27 | |
| Nouvelle version: V1.57 du 10/09/2012 Nouvelle fonction: GetProcessWindowHandle C'est une fonction qui permet de récupérer le handle de la fenêtre principale d'un processus actif à partir du nom de son exécutable. J'ai fait cela pour résoudre le problème soulevé par Cosmos70: on doit savoir si SlimBrowser est actif ou non. S'il n'est pas actif, alors on le lance. S'il est actif, alors on lui envoie ctrl/T pour ouvrir un nouveau TAB. Et voici le programme de démo qui fait exactement ça: - Code:
-
' test_GetProcessusWindowHandle.bas
label test
dim hnd%, res%, s$, SlimBrowser$
dll_on "KGF.dll" SlimBrowser$ = "sbframe.exe"
button 1 : top 1,10 : left 1,10 : width 1,150 caption 1,"Tester SlimBrowser" : on_click 1,test end
test: hnd% = dll_call1("GetProcessWindowHandle",adr(SlimBrowser$)) if hnd%=0 execute "C:\PROGRA~1\SLIMBR~1\sbframe.exe" else hide 0 pause 1000 ' ouvrir un nouveau TAB s$ = chr$(20) : ' control-T res% = dll_call2("SendStringAsText",hnd%,adr(s$)) pause 1000 show 0 end_if return
Donc, Cosmos70, tu peux utiliser le contenu du sous-programme test pour lancer le browser ou ouvrir un nouveau TAB. Dans ce second cas, il ne reste pls qu'à lui envoyer l'URL: simuler un clic dans la zone URL et envoyer l'URL comme simple texte, avec un chr$(13) derrière. La reconnaissance du browser marche, ainsi que l'ouverture du nouvel onglet. | |
| | | pan59
Nombre de messages : 367 Age : 67 Localisation : Wattignies Date d'inscription : 16/10/2011
| Sujet: Pour Klaus. Lun 10 Sep 2012 - 20:00 | |
| Bonsoir Klaus.
Merci pour toutes ces explications, au moins c'est clair maintenant.
Je pensais pouvoir simuler les fonctions avec passage de paramètres, mais je apparemment ce n'est pas possible.
Amicalement. | |
| | | Invité Invité
| Sujet: Re: Fonctions d'envoyer de touches à un objet interne ou externe Lun 10 Sep 2012 - 21:47 | |
| Merci Klaus. Le problème est que tu vas trop vite pour moi. lorsque j'ai posté, la demande, je me suis rendu compte après coup quej'avais rien essayé, et qu'on pouvait certainement "jouer" avec le navigateur.
Je ne rendrais pas compte maintenant des résultats, car il va être temps que je me remette au travail. Après coup je me suis dis que la fonction shell.... que j'utilisais, n'avais de sens que pour mon seul problème. Toi même, vois-tu, une autre nécessitée de remplacer execute pour un problème particulier? Je n'en suis pas sûr par rapport à ce qu'on peut faire avec Panoramic. A moins, de faire une dll qui lance des programmes, avec des noms longs avec espace(s) et peut-être des paramètres entre programme Panoramic. Là je suis parti sur autre chose, sans savoir si c'est utile ou non, et sans prendre le temps d'y réfléchir.
Salutation. |
| | | Contenu sponsorisé
| Sujet: Re: Fonctions d'envoyer de touches à un objet interne ou externe | |
| |
| | | | Fonctions d'envoyer de touches à un objet interne ou externe | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |