FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  FAQFAQ  RechercherRechercher  S'enregistrerS'enregistrer  MembresMembres  GroupesGroupes  Connexion  
Derniers sujets
» Tout est tranquille
par Jean Claude Ven 22 Sep 2017 - 21:41

» Texte en gif animé
par JL35 Ven 22 Sep 2017 - 13:29

» BasicEditor
par Yannick Mer 20 Sep 2017 - 17:17

» Simuler l’appui d'une touche ou combinaison de touches.
par pascal10000 Lun 18 Sep 2017 - 19:30

» Utilisation de HVIEWER pour afficher des images
par papydall Lun 18 Sep 2017 - 17:43

» Panoramic et les gifs animés.
par papydall Lun 18 Sep 2017 - 16:32

» recover source
par pascal10000 Dim 17 Sep 2017 - 14:21

» Recent dans vos menu
par Jean Claude Sam 16 Sep 2017 - 11:41

» Comment centrer un texte 3D.
par pascal10000 Ven 15 Sep 2017 - 20:20

» Carte interface 16 entrées et 16 sorties
par Jicehel Ven 15 Sep 2017 - 16:30

» Version instantanée V 0.9.28i9 possédant l'objet SYNEDIT
par pascal10000 Ven 15 Sep 2017 - 16:20

» Compilateur FBPano
par jean_debord Ven 15 Sep 2017 - 9:59

» 1 (en analyse): 3D_TARGET_IS ne fonctionne pas sur 3D_TEXT
par Jack Jeu 14 Sep 2017 - 19:52

» Problème avec la 3D.
par Jack Jeu 14 Sep 2017 - 18:06

» Test de la 3D.
par mindstorm Mer 13 Sep 2017 - 19:45

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Septembre 2017
LunMarMerJeuVenSamDim
    123
45678910
11121314151617
18192021222324
252627282930 
CalendrierCalendrier

Partagez | 
 

 Fonctions d'envoyer de touches à un objet interne ou externe

Voir le sujet précédent Voir le sujet suivant Aller en bas 
Aller à la page : Précédent  1, 2, 3, 4, 5, 6  Suivant
AuteurMessage
Yannick

avatar

Nombre de messages : 7991
Age : 46
Localisation : Bretagne
Date d'inscription : 15/02/2010

MessageSujet: re   Lun 10 Sep 2012 - 0:45

@ Klaus

Je me suis un peu amusé avec ton code
et je me suis fait un petit outils de plus... Laughing
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
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 10062
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Fonctions d'envoyer de touches à un objet interne ou externe   Lun 10 Sep 2012 - 0: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 !

Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Jicehel

avatar

Nombre de messages : 5855
Age : 45
Localisation : 77500
Date d'inscription : 19/04/2011

MessageSujet: Re: Fonctions d'envoyer de touches à un objet interne ou externe   Lun 10 Sep 2012 - 1: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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
bignono

avatar

Nombre de messages : 1086
Age : 60
Localisation : Val de Marne
Date d'inscription : 13/11/2011

MessageSujet: Re: Fonctions d'envoyer de touches à un objet interne ou externe   Lun 10 Sep 2012 - 1: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! Wink
@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! lol! lol! lol!
N'empèche que c'est bien pratique comme programme! C'est super ce que tu fais!
@+ et bonne nuit à tous. Wink Wink Wink
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Yannick

avatar

Nombre de messages : 7991
Age : 46
Localisation : Bretagne
Date d'inscription : 15/02/2010

MessageSujet: re   Lun 10 Sep 2012 - 1:26

@ bignono,

Embarassed Désolé

il reste un truc que l'on peut ajouter, c'est le multi-site
en créant une base par site... Laughing ou en ajoutant le site dans la base... Twisted Evil


Dernière édition par ygeronimi le Lun 10 Sep 2012 - 1:28, édité 1 fois
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 10062
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Fonctions d'envoyer de touches à un objet interne ou externe   Lun 10 Sep 2012 - 1: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
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Klaus

avatar

Nombre de messages : 10062
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Fonctions d'envoyer de touches à un objet interne ou externe   Lun 10 Sep 2012 - 2: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
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Yannick

avatar

Nombre de messages : 7991
Age : 46
Localisation : Bretagne
Date d'inscription : 15/02/2010

MessageSujet: re   Lun 10 Sep 2012 - 3:21

@ klaus,

Excuse moi, mais je reviens sur "connexion_mydrive".
Pourrais tu documenter ta démarche ( un explique couillon Laughing )
dans ton code tu envoies s$

dans un premier temps il contient le login Laughing
dans un deuxième temps une chaine vide "chr$(9)" Question
puis le mot de passe Laughing
et enfin 3 fois une chaine vide Question
puis pour finir la touche "entrée" par "chr$(13)" Laughing
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Invité
Invité



MessageSujet: Re: Fonctions d'envoyer de touches à un objet interne ou externe   Lun 10 Sep 2012 - 3: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.
Revenir en haut Aller en bas
Invité
Invité



MessageSujet: Re: Fonctions d'envoyer de touches à un objet interne ou externe   Lun 10 Sep 2012 - 4:04

le premier chr$(9): Question 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.
Revenir en haut Aller en bas
bignono

avatar

Nombre de messages : 1086
Age : 60
Localisation : Val de Marne
Date d'inscription : 13/11/2011

MessageSujet: Re: Fonctions d'envoyer de touches à un objet interne ou externe   Lun 10 Sep 2012 - 10:04

Bonjour Klaus Smile ,
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. Wink
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 10062
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Fonctions d'envoyer de touches à un objet interne ou externe   Lun 10 Sep 2012 - 10: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
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Yannick

avatar

Nombre de messages : 7991
Age : 46
Localisation : Bretagne
Date d'inscription : 15/02/2010

MessageSujet: re   Lun 10 Sep 2012 - 14: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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Invité
Invité



MessageSujet: Re: Fonctions d'envoyer de touches à un objet interne ou externe   Lun 10 Sep 2012 - 14: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.
Revenir en haut Aller en bas
Jicehel

avatar

Nombre de messages : 5855
Age : 45
Localisation : 77500
Date d'inscription : 19/04/2011

MessageSujet: Re: Fonctions d'envoyer de touches à un objet interne ou externe   Lun 10 Sep 2012 - 14: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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Yannick

avatar

Nombre de messages : 7991
Age : 46
Localisation : Bretagne
Date d'inscription : 15/02/2010

MessageSujet: re   Lun 10 Sep 2012 - 15: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"...Laughing
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 10062
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Fonctions d'envoyer de touches à un objet interne ou externe   Lun 10 Sep 2012 - 16: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
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Invité
Invité



MessageSujet: Re: Fonctions d'envoyer de touches à un objet interne ou externe   Lun 10 Sep 2012 - 16: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.
Revenir en haut Aller en bas
Klaus

avatar

Nombre de messages : 10062
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Fonctions d'envoyer de touches à un objet interne ou externe   Lun 10 Sep 2012 - 18:24

Je vais étudier la question.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
bignono

avatar

Nombre de messages : 1086
Age : 60
Localisation : Val de Marne
Date d'inscription : 13/11/2011

MessageSujet: Re: Fonctions d'envoyer de touches à un objet interne ou externe   Lun 10 Sep 2012 - 18:42

Bonjour Klaus, Smile
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+ Wink
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
pan59

avatar

Nombre de messages : 367
Age : 60
Localisation : Wattignies
Date d'inscription : 16/10/2011

MessageSujet: Pour Klaus.   Lun 10 Sep 2012 - 19: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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 10062
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Fonctions d'envoyer de touches à un objet interne ou externe   Lun 10 Sep 2012 - 20: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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Klaus

avatar

Nombre de messages : 10062
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Fonctions d'envoyer de touches à un objet interne ou externe   Lun 10 Sep 2012 - 20: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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
pan59

avatar

Nombre de messages : 367
Age : 60
Localisation : Wattignies
Date d'inscription : 16/10/2011

MessageSujet: Pour Klaus.   Lun 10 Sep 2012 - 21: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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Invité
Invité



MessageSujet: Re: Fonctions d'envoyer de touches à un objet interne ou externe   Lun 10 Sep 2012 - 22: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.
Revenir en haut Aller en bas
Contenu sponsorisé




MessageSujet: Re: Fonctions d'envoyer de touches à un objet interne ou externe   

Revenir en haut Aller en bas
 
Fonctions d'envoyer de touches à un objet interne ou externe
Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 4 sur 6Aller à la page : Précédent  1, 2, 3, 4, 5, 6  Suivant
 Sujets similaires
-
» Passer un objet devant les autres (ou derrière)
» Comment envoyer une détection chez avira avec Antivir 9 français - Version Classic
» Récupérer toutes les touches tapées
» Opération sur objet EDIT
» Piano à 88 touches

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: Activité des sites créés par les Panoramiciens. :: Le site de Klaus-
Sauter vers: