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
» TourD Version 2
par Minibug Aujourd'hui à 1:50

» La métamatière et le peuple
par JL35 Hier à 21:18

» Capture d'une zone de l'écran total
par JL35 Hier à 18:41

» Logiciel de soutien scolaire en langues.
par Pedro Alvarez Hier à 11:49

» qui peut résoudre mon prb
par pascal10000 Jeu 16 Nov 2017 - 17:30

» évènements et objets système : listage automatique
par Jean Claude Jeu 16 Nov 2017 - 11:15

» Panoramic et la reconnaissance vocale.
par papydall Jeu 16 Nov 2017 - 3:45

» Bizzarerie dans Edge
par Marc 37 Mer 15 Nov 2017 - 17:45

» KGF_dll - nouvelles versions
par Klaus Mer 15 Nov 2017 - 2:08

» Analyser un code Panoramic
par JL35 Lun 13 Nov 2017 - 18:38

» Un bonjour en passant...
par Minibug Dim 12 Nov 2017 - 19:57

» mise a jour calculatrice
par joeeee2017 Dim 12 Nov 2017 - 4:20

» comment accèder à l'heure et à la date d'un fichier
par Klaus Sam 11 Nov 2017 - 0:53

» Compilateur FBPano
par Jicehel Mer 8 Nov 2017 - 15:22

» Mon adresse e-mail
par treehouse Mer 8 Nov 2017 - 14:36

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Novembre 2017
LunMarMerJeuVenSamDim
  12345
6789101112
13141516171819
20212223242526
27282930   
CalendrierCalendrier

Partagez | 
 

 Nouvelle DLL: intercepter clic gauche, double et droit !

Voir le sujet précédent Voir le sujet suivant Aller en bas 
Aller à la page : 1, 2  Suivant
AuteurMessage
Klaus

avatar

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

MessageSujet: Nouvelle DLL: intercepter clic gauche, double et droit !   Ven 20 Jan 2012 - 18:32

J'ai fait une petite DLL permettant d'intercepter le clic gauche, le double-clic gauche et le clic droit, sur un onjet Panoramic !



C'est ClickIntercept.dll dans DLLs Divers sur mon site. La doc a été mise à jour pour cela.

Voici un programme de démo. Il contient un picture sur lequel on peut essayer ces évènements. Par défaut, l'interception est désactivée - ces clics n'auront donc pas d'effet. Le bouton "Activer" permet l'installation de l'interception des évènements souris, le bouton "Desactiver" apparaît alors pour revenir en arrière. On peut maintenant utiliser les différents clics dans le picture, on verra alors les cases à cocher correspondantes de remlir, et un message texte signale le type d'évènement reçu. Après chaque essai, il faut utiliser le bouton "Purger" pour effacer les cases à cocher. Les boutons en haut à gauche permettent de simuler ces clics, par programmation.

Une note technique:

La difficulté de l'interception d'un double-clic tient à la façon dont Windows gère les évènements souris. Un double-clic est en réalite une succession de deux simples clics. Lors de la réception du premier simple clic, Windows signale simplement un évènement "clic gauche". Lorsque le second simple clic arrive, Windows signale ceci de la même manière. Il est de la responsabilité du programme application de gérer cela, si le délai entre les deux clics est "très court". Et, à moins d'être extra-lucide, Windows ne peut pas savoir qu'un autre clic gauche arrivera brièvement après le premier !

J'ai donc choisi de procéder ainsi:
Pour chaque clic gauche, je signale un clic gauche.
Pour chaque clic droit, je signale un clic droit.
Si un clic gauche arrive moins de 500 milli-secondes après aun autre clic gauche, je signale EN PLUS un double-clic.
Dans le programme application, à la réception d'un clic gauche, je lance un timer de 500 milli-secondes. Et tout se passe dans la routine évènement de ce timer. Si dans cette routine, on constate qu'un double-clic a été signalé, j'écarte le simple clic et ne traite que le double clic. Et voilà, le tout est joué.

Maintenant, je sais: certains choix sont discutables. Pourquoi 500 ms ? On pourra dans des versions futures certainement améliorer, raccourcir ce délai voir le rendre paramétrable. On pourra aussi ajouter d'autres évènements (je pense à la molette...). Mais surtout, il faudra ajouter un moyen de retourner les coordonnées du clic - et c'est l'étape suivante.

Donc, après tout ce baratin, voici le programme de démo:
Code:
label fermer, xxx01, xxx02, xxx03
label clic1, clic2, clic3, clic100
label activer, desactiver, purger
label timer99, simple, double, droit

dim hnd1%, hnd2%, res%

button 1 : top 1,150 : left 1,10 : caption 1,"Fermer"
on_click 1,fermer

button 10 : top 10,10 : left 10,10 : caption 10,"XXX01"
on_click 10,xxx01 : hide 10
button 11 : top 11,10 : left 11,100 : caption 11,"XXX02"
on_click 11,xxx02 : hide 11
button 12 : top 12,10 : left 12,190 : caption 12,"XXX03"
on_click 12,xxx03 : hide 12

button 30 : top 30,40 : left 30,10 : caption 30,"clic simple"
on_click 30,clic1
button 31 : top 31,40 : left 31,100 : caption 31,"clic double"
on_click 31,clic2
button 32 : top 32,40 : left 32,190 : caption 32,"clic droit"
on_click 32,clic3

memo 100 : top 100,10 : left 100,300
' le ON_CLICK est désactivé INTENTIONNELLEMENT !
' on_click 100,clic100
button 101 : top 101,110 : left 101,300 : caption 101,"Activer"
on_click 101,activer
button 102 : top 102,110 : left 102,400 : caption 102,"Désactiver"
on_click 102,desactiver : inactive 102

check 201 : top 201,200 : left 201,300 : caption 201,"Clic simple"
check 202 : top 202,230 : left 202,300 : caption 202,"Clic double"
check 203 : top 203,260 : left 203,300 : caption 203,"Clic droit"
button 209 : top 209,290 : left 209,300 : caption 209,"Purger"
on_click 209,purger

timer 99 : timer_off 99 : timer_interval 99,500
on_timer 99,timer99

dll_on "ClickIntercept.dll"

res% = dll_call2("ClickSetLink",0,0)
hnd1% = dll_call2("ClickSetLink",handle(10),1)
hnd2% = dll_call2("ClickSetLink",handle(11),2)
hnd2% = dll_call2("ClickSetLink",handle(12),3)
' message str$(hnd1%)+" "+str$(hnd2%)
end

simple:
message "click simple dans mémo"
return

double:
message "click double dans mémo"
return

droit:
message "click droit dans mémo"
return

purger:
mark_off 201
mark_off 202
mark_off 203
return

activer:
inactive 101
res% = dll_call1("ClickSetHook",handle(100))
active 102
return

desactiver:
inactive 102
res% = dll_call1("ClickClearHook",handle(100))
active 101
return

fermer:
res% = dll_call1("ClickClearHook",handle(100))
dll_off
terminate

xxx01:
mark_on 201
timer_on 99
return

xxx02:
mark_on 202
return

xxx03:
mark_on 203
timer_on 99
return

timer99:
timer_off 99
if checked(202)=1 then mark_off 201
' ici, on dispatche selon l'évènement à traiter
if checked(201)=1 then gosub simple
if checked(202)=1 then gosub double
if checked(203)=1 then gosub droit
return

clic1:
res% = dll_call1("ClickIt",1)
return

clic2:
res% = dll_call1("ClickIt",1)
res% = dll_call1("ClickIt",2)
return

clic3:
res% = dll_call1("ClickIt",3)
return

clic100:
message "Clic simple sur le mémo"
mark_on 201
return

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



Nombre de messages : 5979
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: Nouvelle DLL: intercepter clic gauche, double et droit !   Ven 20 Jan 2012 - 20:05

Intéressant !
mais chez moi je n'arrive pas à détecter le clic droit (gauche et double ça marche).
Ca marche si je clique gauche sur le bouton 'clic droit'
Ou alors quelque chose m'a échappé ?

Snif, le clic droit c'est le seul qui m'intéresse...
(je précise que je n'ai pas étudié le code, juste essayé).


Rectificatif: je n'avais pas 'Activé' ! Embarassed et là ça semble marcher... je continue
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

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

MessageSujet: Re: Nouvelle DLL: intercepter clic gauche, double et droit !   Ven 20 Jan 2012 - 20:17

Ah ! Je me disais aussi...

Voici ce que ça donne chez moi, avec le clic droit:
[img][/img]

Demain, certainement, la mise à disposition des coordonnées de ces clics ! C'est en cours...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
JL35



Nombre de messages : 5979
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: Nouvelle DLL: intercepter clic gauche, double et droit !   Ven 20 Jan 2012 - 20:37

Oui Klaus, ça marche, excuse-moi de t'avoir inquiété, même fugitivement...
J'ai même simplifié ton test pour ne garder que la détection du clic droit, a priori je n'ai pas l'usage du double-clic, et le clic gauche j'ai ce qu'il faut avec Panoramic.

Même avec les coordonnées, il me restera quand même le problème du clic droit dans un LIST: savoir quel élément a été cliqué, s'il y a eu défilement par exemple. Mais ça je pense que seul Jack pourrait y répondre.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

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

MessageSujet: Re: Nouvelle DLL: intercepter clic gauche, double et droit !   Ven 20 Jan 2012 - 20:54

Cela fait partie des éléments que je rechercherai. Il y a sûrement un moyen, puisqu'il s'agit de composants Windows standard que je peux toucher à travers leur handle. Je peux déjà déclencher l'évènement on_click sur un bouton, et on_change dans un edit. Je peux aussi changer la caption d'un bouton, d'un alpha et d'une form, et changer les données d'un edit. C'est déjà pas mal. Je pense que je pourrai identifier la ligne cliquée dans un mémo ou dans une liste.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Klaus

avatar

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

MessageSujet: Re: Nouvelle DLL: intercepter clic gauche, double et droit !   Ven 20 Jan 2012 - 21:26

C'est allé plus vite que prévu: voici une version qui permet de retourner les coordonnées du clic en pixels. Pour cela, la routine ClickSetHook prend un second paramètre qui est le handle d'un objet Panoramic qui recevra les coordonnées. Si ce paramètre est passé avec la valeur zéro, rien ne sera retourné. C'est testé avec un edit, mais cela peut également être un alpha, sans problème. Les coordonnées sont retournées sous forme d'une chaine de caractères représentant les valeurs numériques de x suivie de y, séparées par une virgule. Exemple: 43,177.

Voici le programme de démo adapté à cette version:
Code:
label fermer, xxx01, xxx02, xxx03
label clic1, clic2, clic3, clic100
label activer, desactiver, purger
label timer99, simple, double, droit

dim hnd1%, hnd2%, res%

button 1 : top 1,150 : left 1,10 : caption 1,"Fermer"
on_click 1,fermer

button 10 : top 10,10 : left 10,10 : caption 10,"XXX01"
on_click 10,xxx01 : hide 10
button 11 : top 11,10 : left 11,100 : caption 11,"XXX02"
on_click 11,xxx02 : hide 11
button 12 : top 12,10 : left 12,190 : caption 12,"XXX03"
on_click 12,xxx03 : hide 12

button 30 : top 30,40 : left 30,10 : caption 30,"clic simple"
on_click 30,clic1
button 31 : top 31,40 : left 31,100 : caption 31,"clic double"
on_click 31,clic2
button 32 : top 32,40 : left 32,190 : caption 32,"clic droit"
on_click 32,clic3

memo 100 : top 100,10 : left 100,300
' le ON_CLICK est désactivé INTENTIONNELLEMENT !
' on_click 100,clic100
button 101 : top 101,110 : left 101,300 : caption 101,"Activer"
on_click 101,activer
button 102 : top 102,110 : left 102,400 : caption 102,"Désactiver"
on_click 102,desactiver : inactive 102

check 201 : top 201,200 : left 201,300 : caption 201,"Clic simple"
check 202 : top 202,230 : left 202,300 : caption 202,"Clic double"
check 203 : top 203,260 : left 203,300 : caption 203,"Clic droit"
button 209 : top 209,290 : left 209,300 : caption 209,"Purger"
on_click 209,purger
edit 250 : top 250,350 : left 250,300

timer 99 : timer_off 99 : timer_interval 99,500
on_timer 99,timer99

dll_on "ClickIntercept.dll"

res% = dll_call2("ClickSetLink",0,0)
hnd1% = dll_call2("ClickSetLink",handle(10),1)
hnd2% = dll_call2("ClickSetLink",handle(11),2)
hnd2% = dll_call2("ClickSetLink",handle(12),3)
' message str$(hnd1%)+" "+str$(hnd2%)
end

simple:
message "click simple dans mémo"
return

double:
message "click double dans mémo"
return

droit:
message "click droit dans mémo"
return

purger:
mark_off 201
mark_off 202
mark_off 203
text 250,""
return

activer:
inactive 101
res% = dll_call2("ClickSetHook",handle(100),handle(250))
active 102
return

desactiver:
inactive 102
res% = dll_call1("ClickClearHook",handle(100))
active 101
return

fermer:
res% = dll_call1("ClickClearHook",handle(100))
dll_off
terminate

xxx01:
mark_on 201
timer_on 99
return

xxx02:
mark_on 202
return

xxx03:
mark_on 203
timer_on 99
return

timer99:
timer_off 99
if checked(202)=1 then mark_off 201
' ici, on dispatche selon l'évènement à traiter
if checked(201)=1 then gosub simple
if checked(202)=1 then gosub double
if checked(203)=1 then gosub droit
return

clic1:
res% = dll_call1("ClickIt",1)
return

clic2:
res% = dll_call1("ClickIt",1)
res% = dll_call1("ClickIt",2)
return

clic3:
res% = dll_call1("ClickIt",3)
return

clic100:
message "Clic simple sur le mémo"
mark_on 201
return

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

avatar

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

MessageSujet: Re: Nouvelle DLL: intercepter clic gauche, double et droit !   Ven 20 Jan 2012 - 22:02

Génial, plus rien ne t'arrête Klaus ^^
Il va falloir se creuser la tête bientôt pour te donner des défits interessants...
Encore une fonctionnalité très utile
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
bignono

avatar

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

MessageSujet: Re: Nouvelle DLL: intercepter clic gauche, double et droit !   Ven 20 Jan 2012 - 22:07

Bonsoir Klaus, Smile
Je ne sais pas encore me servir des dll car pour moi cela me paraît encore abstrait, mais je vais attendre patiemment que tu aies fini de la programmer, parce que le double clic gauche manque à Panoramic. Cela est une fonction très interessante et qui dans un logiciel quelconque permet plus de fluidité et moins de manipulation. C'est plus de rapidité et d'ergonomie!
Merci beaucoup!
@ + Wink
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
exdragon

avatar

Nombre de messages : 601
Date d'inscription : 05/01/2012

MessageSujet: Re: Nouvelle DLL: intercepter clic gauche, double et droit !   Sam 21 Jan 2012 - 8:28

Citation :
Il va falloir se creuser la tête bientôt pour te donner des défits interessants...

Justement j'avais pensé faire un topic "Défis" proposant un sujet à réaliser, puis je me suis dis que le gagnant sera toujours le même^^
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Nardo26

avatar

Nombre de messages : 2294
Age : 49
Localisation : Valence
Date d'inscription : 02/07/2010

MessageSujet: Re: Nouvelle DLL: intercepter clic gauche, double et droit !   Sam 21 Jan 2012 - 12:24

Bonjour à tous !

Ca marche super bien Klaus ! Very Happy
Encore une dll bien utile !!!

PS: La description de Divers.DLL n'est pas à jour sur ton site. Je suppose que lorsque tu auras finaliser la DLL, tu mettras le prog de demo également dans le zip?...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://nardo26.lescigales.org
Jicehel

avatar

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

MessageSujet: Re: Nouvelle DLL: intercepter clic gauche, double et droit !   Sam 21 Jan 2012 - 13:25

Il développe tellement vite de super DLL qu'il n'arrive plus à faire les docs ...
Heu, si je peux proposer une idée pour les prochaine DLL et si ça intéresse Klaus, il y a un truc qui doit être faisable et dont je rêve depuis plus d'un an... Une DLL pour utiliser le SAPI (la synthèse vocale ...).
Enfin bon, je fais ma demande, après c'est Klaus qui voit si ça l’intéresse et comment ça s'intègre dans sa todo liste au cas ou ...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

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

MessageSujet: Re: Nouvelle DLL: intercepter clic gauche, double et droit !   Sam 21 Jan 2012 - 15:31

Une nouvelle version est mise en ligne.

Nouveautés:
- la doc est mise à jour
- le programme de démo est maintenant dans la distribution DLLs Divers
- gestion du MEMO et du LIST
- il y a une commande pour gérer la taille de la polie dans l'objet ciblé - à paramétrer selon les besoins
- on n'a plus besoin de désactiver ON_CLICK sur l'objet ciblé.
- on clic quelconque dans l'objet ciblé place le curseur à l'endroit du clic

Le programme de démo permet, via deux options, de choisir le type d'objet sur lequel on veut travailler: MEMO ou LIST. La gestion des accessibilités des boutons a été améliorée et sécurisée. Dans le cas d'une LIST, on peut obtenir la ligne ciblée par l'action de la souris.

La commande FONT_SIZE se trouve en ligne 78, au début du sous-programme INIT_OBJ.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
exdragon

avatar

Nombre de messages : 601
Date d'inscription : 05/01/2012

MessageSujet: Re: Nouvelle DLL: intercepter clic gauche, double et droit !   Dim 22 Jan 2012 - 0:17

Citation :
la taille de la polie
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

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

MessageSujet: Re: Nouvelle DLL: intercepter clic gauche, double et droit !   Dim 22 Jan 2012 - 0:39

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

avatar

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

MessageSujet: Re: Nouvelle DLL: intercepter clic gauche, double et droit !   Dim 22 Jan 2012 - 15:31

@Jicehel; tu as mentionné SAPI - c'est fait ! Regarde le nouveau fil de discussion à ce sujet. Maintenant, Panoramic sait parler :
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Jicehel

avatar

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

MessageSujet: Re: Nouvelle DLL: intercepter clic gauche, double et droit !   Dim 22 Jan 2012 - 18:23

Merci, Klaus, j'ai répondu dans le premier post où je l'ai lu.. Je test tout de suite et je mets la réponse dans le bon post pour ton faire un retour des test Smile
En tout cas, impressionnant en rapidité !!
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

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

MessageSujet: Re: Nouvelle DLL: intercepter clic gauche, double et droit !   Lun 23 Jan 2012 - 15:04

Nouvelle version de ClickIntercept.dll:

Maiintenant, on peut intercepter les évènements "Mouse in" (code 5) et "Mouse out" (code 6) !

Ceci permet de gérer le survol de l'objet concerné !

D'ailleurs, le programme de démo met cela en évidence en changeant la couleur de fond du mémo ou de la list pendant que le curseur se trouve DANS l'objet ! C'est juste un exemple de ce qu'on peut faire.

EDIT

Ca marche aussi avec un objet EDIT et BUTTON! Le programme de démo inclut maintenant MEMO, LIST, EDIT et BUTTON.

En fait, ça marche avec tous les objets pour lesquels on peut utiliser la fonction handle(). On les trouve dans Aide/Manuel de référence/handle. Mais pour voir cela dans le programme de démo, il faut l'adapter en conséquence, bien sûr. Ceci dit, en s'inspirant de la logique d'utilisation des fonctions dans le programme de démo et avec la doc, il est aisé de construire un petit programme pour un type d'objet spécifique.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Klaus

avatar

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

MessageSujet: Re: Nouvelle DLL: intercepter clic gauche, double et droit !   Mer 25 Jan 2012 - 20:20

Voici un progrfamme Panoramic utilisant ClickIntercept.dll telle qu'elle est (il n'y a donc pas de mise à jour de la DLL pour cela). Ce programme permet de choisir un objet Panoramic parmi une liste de 16 (!) objets possibles. L'interception des clics y compris la détection "entrée souris" et "sortie souris" sera alors activée, et on peut observer le résultat dans un mémo servant de "trace", ainsi que par l'aspect de l'objet qui change sur entrée et sortie de la souris.

Certains objets posent encore problème, et ceci est signalé dans le source ainsi que dans la "trace". C'est certainement provisoire. Mais dès à présent, on peut utiliser cette DLL sur une douzaine d'objets Panoramic différents, avec des résultats intéressants. On peut même gérer le clic droit sur une ligne d'un LIST, et le différencier du clic gauche, ainsi que le double-clic !

Vous verrez, c'est spectaculaire de vois changer un mémo ou un bouton (!) changer d'aspect si le curseur passe par-dessus, sans même avoir à le cliquer !

Voici le source:
Code:
'      demo clickintercept objets.bas

' ce programme montre l'usage de ClickIntercept.dll
' pour tous les objets possibles.

' les objets possibles sont ceux pour lesquels on peut
' avoir un handle par la fonction handle():
'    scene3d, button, edit, memo, combo, alpha, form
'    list, check, option, main_menu, sub_menu,
'    movie, track_bar, scroll_bar, progress_bar, scene2d
' malgré la possibilité d'avoir un handle pour SOUND, MAIN_MENU
' OPEN_DIALOG et SAVE_DIALOG, ces objets ne sont pas utlisables
' ici car ils sont invisibles.

' Les zones spécifiques à la gestion de la DLL sont commentées.
' On peut ainsi extraire les parties obligatoires, ainsi que les
' instructions spécifiques à la gestion de certains types d'objet.

' ATTENTION: l'objet COMBO pose problème - il n'est pas utilisable
' en l'état !.

' ATTENTION: à cause d'un bug pour HANDLE() pour un ALPHA, la gestion
' de cet objet ne peut pas encore être faite !

' ATTENTION: SUB_MENU pose encore un problème qui est à l'étude !

label montrer, communs1, communs2, clickobj, cacher, close0
label gauche, double, droit, molette, mousein, mouseout, timer99
label memolistcombo, communs1bis, clickobjbis, communs3

data    "scene3d",1, "button",1, "edit",1, "memo",1, "combo",1
data    "alpha",0, "form",0
data    "list",1, "check",1, "option",1, "sub_menu",0
data    "movie",1, "track_bar",1
data    "scroll_bar",1, "progress_bar",1, "scene2d",1
data    "*fini*"
dim  maxobj%  : maxobj% = 0

dim obj%, i%, s$, res%, f_simple%, f_dedans%
dim hndtab%(20)

height 0,650

' charger et afficher la liste des objets disponibles
alpha 101 : top 101,20 : left 101,10 : caption 101,"Objet:"
combo 102 : top 102,40 : left 102,10
repeat
    read s$
    if s$<>"*fini*"
        maxobj% = maxobj% + 1
        read hndtab%(maxobj%)
        item_add 102,s$
    end_if
until s$="*fini*"

' créer les boutons "Montrer" et "Cacher" mutuellement exclusifs
button 103 : top 103,70 : left 103,10 : caption 103,"Montrer"
on_click 103,montrer
button 104 : top 104,70 : left 104,10 : caption 104,"Cacher"
on_click 104,cacher : hide 104

' ceci sont les boutons d'interface avec la DLL ClickIntercept.dll.
' leur évènement ON_CLICK signale l'évènement détecté par la DLL.
button 201 : hide 201 : on_click 201,gauche
button 202 : hide 202 : on_click 202,double
button 203 : hide 203 : on_click 203,droit
button 204 : hide 204 : on_click 204,molette
button 205 : hide 205 : on_click 205,mousein
button 206 : hide 206 : on_click 206,mouseout

' cet EDIT sert à recevoir les coordonnées de la souris au moment du clic
alpha 301 : top 301,130 : left 301,10 : caption 301,"Coordonnées:"
edit 302 : top 302,130 : left 302,100
' ce MEMO sert à montrer les évènements détectés par la DLL
alpha 303 : top 303,160 : left 303,10 : caption 303,"Trace:"
memo 304 : top 304,160 : left 304,100 : height 304,400

' ce timer est indispensable pour différencier les simples clics
' des doubles clics. L'intervalle peut éventuellement être raccourci.
timer 99 : timer_off 99 : timer_interval 99,500
on_timer 99,timer99

' on crée tous les objets possibles, et on les cache. Les routines
' COMMUNSx serventà configurer des attributs communs à plusieurs objets.
obj% = 0
scene3d      1 : hide  1        : gosub communs1
button        2 : hide  2        : gosub communs1
edit          3 : hide  3        : gosub communs1
memo          4 : hide  4        : gosub communs1
combo        5 : hide  5        : gosub communs1
alpha        6 : hide  6        : gosub communs2
form          7 : hide  7        : obj% = obj% + 1
list          8 : hide  8        : gosub communs1
check        9 : hide  9        : gosub communs1
option      10 : hide 10        : gosub communs1
option    1010 : hide 1010      : gosub communs1bis
sub_menu    11 : hide 11        : gosub communs3
movie        12 : hide 12        : gosub communs2
track_bar    13 : hide 13        : gosub communs2
scroll_bar  14 : hide 14        : gosub communs2
progress_bar 15 : hide 15        : gosub communs2
scene2d      16 : hide 16        : gosub communs1

' on charage la DLL
dll_on "ClickIntercept.dll"
' la routine CLOSE0 servira à désactiver les interceptions de clics
' afin de ne pas perturber le système, e, sortant
on_close 0,close0

' ici, on établit le lien entre les évènements (par leur ID)
' et les boutons dont la routine ON_CLICK leur sera associée.
res% = dll_call2("ClickSetLink",0,0)            : ' tout effacer
res% = dll_call2("ClickSetLink",handle(201),1)  : ' clic gauche
res% = dll_call2("ClickSetLink",handle(202),2)  : ' double-clic
res% = dll_call2("ClickSetLink",handle(203),3)  : ' clic droit
' res% = dll_call2("ClickSetLink",handle(204),3)  : ' pas encore implémenté
res% = dll_call2("ClickSetLink",handle(205),5)  : ' souris entrante
res% = dll_call2("ClickSetLink",handle(206),6)  : ' souris sortante

end

' ******************* fin du programme principal *************

' ------------------- appelé en fermeture du programme -------
close0:
    if obj%>0    : ' est-ce qu'on a un traitement activé pour un objet ?
    ' si cet objet a une interception des clics, alors les désactiver
        if hndtab%(obj%)=1 then res% = dll_call1("ClickClearHook",handle(obj%))
    end_if
    dll_off  : ' décharger la DLL
return

' ------------------- évènement timer spécial pour les double-clics ---
timer99:
    timer_off 99    : ' couper le timer
    if f_simple%=1  : ' est-ce qu'on a déjà reçu un clic gauche ?
        f_simple% = 0    : ' oui donc on a un clic simple !
' ***** ici, on place le traitement spécifique au simple-clic
        item_add 304,"DLL: clic gauche"
        if instr("combo,list",s$)>0 then item_add 304,"--> indexe "+str$(item_index(obj%))
' ***** fin du traitement spécifique au double-clic
' ===== ici, on trouve des traitements à effectuer selon le type d'obbjet
        if instr("scene3d",s$)=0 then set_focus obj%
        if s$="check"
            if checked(obj%)=1
                mark_off obj%
            else
                mark_on obj%
            end_if
        end_if
' ===== fin des traitements selon le type d'objet
    end_if
return

' ------------------- évènement clic gauche détecté par la DLL -----
gauche:
    timer_off 99      : ' on coupe le timer
    f_simple% = f_simple% + 1  : ' on incrémente le compteur de clics gauches
    if f_simple%=2              : ' est-ce qu'on a déjà 2 clics ?
        f_simple% = 0          : ' oui, donc c'est un double-clic !
' ***** ici, on place le traitement spécifique au double-clic
        item_add 304,"DLL: clic double"
        if instr("combo,list",s$)>0 then item_add 304,"--> indexe "+str$(item_index(obj%))
' ***** fin du traitement spécifique au double-clic
' ===== ici, on trouve des traitements à effectuer selon le type d'obbjet
        if instr("scene3d",s$)=0 then set_focus obj%
' ===== fin des traitements selon le type d'objets
        return
    end_if
' item_add 304,"attente"
    timer_on 99
return

' ------------------- évènement double clic détecté par PANORAMIC -----
double:
    timer_off 99    : ' on coupe le timer
    f_simple% = 0    : ' on remet le compteur de clics à zéro
' ***** ici, on place le traitement spécifique au double-clic
    item_add 304,"PANORAMIC: clic double"
    if instr("combo,list",s$)>0 then item_add 304,"--> indexe "+str$(item_index(obj%))
' ***** fin du traitement spécifique au double-clic
' ===== ici, on trouve des traitements à effectuer selon le type d'obbjet
    if instr("scene3d",s$)=0 then set_focus obj%
' ===== fin des traitements selon les objets
return

' ------------------- évènement clic droit détecté par la DLL -----
droit:
' ***** ici, on place le traitement spécifique au double-clic
    item_add 304,"DLL: clic droit"
    if instr("combo,list",s$)>0 then item_add 304,"--> indexe "+str$(item_index(obj%))
' ***** fin du traitement spécifique au clic droit
' ===== ici, on trouve des traitements à effectuer selon le type d'obbjet
    if instr("scene3d",s$)=0 then set_focus obj%
' ===== fin des traitements selon les objets
return

' ------------------- évènement molette détecté par la DLL -----
molette:
' ***** ici, on place le traitement spécifique au double-clic
    item_add 304,"DLL: molette"
' ***** fin du traitement spécifique à la molette
' ===== ici, on trouve des traitements à effectuer selon le type d'obbjet
    if instr("scene3d",s$)=0 then set_focus obj%
' ===== fin des traitements selon les objets
return

' ------------------- évènement souris entrante détecté par la DLL -----
mousein:
    if f_dedans%=1 then return    : ' la souris est déjà dedans ? ignorer !
    f_dedans% = 1                  : ' mémoriser que la souris est dedans
' ***** ici, on place le traitement spécifique à l'entrée de la souris
    item_add 304,"DLL: souris entrée"
    if s$="alpha"
        font_color obj%,255,0,0
    end_if
    if instr("button,scene2d,movie,track_bar,scroll_bar,progress_bar",s$)>0
        height obj%,height(obj%)+2
        width obj%,width(obj%)+2
        if instr("movie,track_bar,scroll_bar,progress_bar",s$)=0 then font_bold obj%
    end_if
' ***** fin du traitement spécifique à l'entrée de la souris
' ===== ici, on trouve des traitements à effectuer selon le type d'obbjet
    if instr("memo,edit,list,scene3d,combo,check",s$)>0
        color obj%,220,220,255
        if instr("scene3d",s$)=0 then set_focus obj%
    end_if
' ===== fin des traitements selon le type d'objet
return

' ------------------- évènement souris sortante détecté par la DLL -----
mouseout:
    if f_dedans%=0 then return  : ' souris déjà dehors ? ignorer
    f_dedans% = 0              : ' mémoriser que la souris est dehors
' ***** ici, on place le traitement spécifique à la sortie de la souris
    item_add 304,"DLE: souris sortie"
    if s$="alpha"
        font_color obj%,0,0,0
    end_if
    if instr("button,scene2d,movie,track_bar,scroll_bar,progress_bar",s$)>0
        height obj%,height(obj%)-2
        width obj%,width(obj%)-2
        if instr("movie,track_bar,scroll_bar,progress_bar",s$)=0 then font_bold_off obj%
    end_if
' ***** fin du traitement spécifique à la sortie de la souris
' ===== ici, on trouve des traitements à effectuer selon le type d'obbjet
    if instr("memo,edit,list,scene3d,combo,check",s$)>0
        color obj%,210,210,255
        if instr("scene3d",s$)=0 then set_focus obj%
    end_if
' ===== fin des traitements selon le type d'objet
return


' -------------------  routines de configuration des objets test ---
communs1:
    obj% = obj% + 1
    top obj%,10
    left obj%,300
    on_click obj%,clickobj
    return
   
communs1bis:
    top obj%+1000,70
    left obj%+1000,300
    on_click obj%+1000,clickobjbis
    return

communs2:
    obj% = obj% + 1
    top obj%,10
    left obj%,300
    return

communs3:
    obj% = obj% + 1
    main_menu  obj%+1000
    parent obj%,obj%+1000
    caption 11,"Sous-menu "
    on_click obj%,clickobj
    return

' ------------------- évènement PANORAMIC ON_CLICK des objets teste ---
clickobj:
    item_add 304,"PANORAMIC: Click objet"
return

' ------------------- évènement PANORAMIC ON_CLICK sur second OPTION ---
clickobjbis:
    item_add 304,"PANORAMIC: Click objet"
return

' -------------------désactiver objet test et cacher tout --------
cacher:
    hide obj%    : ' cacher l'objet
    if s$="option" then hide obj%+1000  : ' cacher aussi la seconde option
' si l'objet peut intercepter les clics, alors déactiver l'interception
    if hndtab%(obj%)=1 then res% = dll_call1("ClickClearHook",handle(obj%))
' restaurer l'écran pour pouvoir lancer un nouveau test
    hide 104 : show 103
    obj% = 0 : f_simple% = 0
    active 102
return

' -------------------charger,les objets MEM, LIST et COMBO avec quelques lignes
memolistcombo:
    clear obj%
    for i%=1 to 8
        item_add obj%,s$+" ligne "+str$(i%)
    next i%
    return

' -------------------montrer l'objet à tester et intercepter les clics
montrer:
inactive 102
s$ = trim$(item_index$(102))  : ' récupérer le nom de l'objet
if s$="" then return          : ' rien choisi ?
obj% = item_index(102)        : ' récuper le ID de l'objet choisi
clear 304                      : ' effacer le mémo pour la trace
item_add 304,"Objet "+s$      : ' signaler le nom de l'objet
f_dedans% = 0                  : ' supposer "souris est dehors'
' traitements spécifiques pour tester un objet -----------------
select obj%

'---------- scene3d
case 1
    color obj%,210,210,255 : show obj%
    res% = dll_call2("ClickSetHook",handle(obj%),handle(302))
    hide 103 : show 104
   
'---------- button
case 2
    caption obj%,"Bouton" : show obj%
    res% = dll_call2("ClickSetHook",handle(obj%),handle(302))
    hide 103 : show 104
   
'---------- edit
case 3
    color obj%,210,210,255 : show obj%
    res% = dll_call2("ClickSetHook",handle(obj%),handle(302))
    hide 103 : show 104
   
'---------- memo
case 4
    color obj%,210,210,255 : show obj%
    gosub memolistcombo
    res% = dll_call2("ClickSetHook",handle(obj%),handle(302))
    hide 103 : show 104
   
'---------- combo
case 5
    item_add 304,"+++ ne marche pas !"
    color obj%,210,210,255 : show obj%
    gosub memolistcombo
    res% = dll_call2("ClickSetHook",handle(obj%),handle(302))
    hide 103 : show 104
   
'---------- alpha
case 6
    caption obj%,"Alpha" : font_color obj%,0,0,0 : show obj%
'    res% = dll_call2("ClickSetHook",handle(obj%),handle(302))
    on_click obj%,clickobj : ' car BUG sur handle() pour ALPHA !
    hide 103 : show 104
   
'---------- form
case 7
    message 'Pas encore implémenté !"
    hide 103 : show 104
   
'---------- list
case 8
    color obj%,210,210,255 : show obj%
    gosub memolistcombo
    res% = dll_call2("ClickSetHook",handle(obj%),handle(302))
    hide 103 : show 104
   
'---------- check
case 9
    color obj%,210,210,255 : show obj%
    res% = dll_call2("ClickSetHook",handle(obj%),handle(302))
    hide 103 : show 104
   
'---------- option
case 10
' pour OPTION, une seconde option est automatiquement créée et
' affichée, avec le numéro obj%+1000, mais seule l'objet obj%
' est utilisé pour intercepter les clics par la DLL.
    color obj%,210,210,255 : show obj% : show obj%+1000
    res% = dll_call2("ClickSetHook",handle(obj%),handle(302))
    hide 103 : show 104
   
'---------- sub_menu
case 11
    item_add 304,"+++ ne marche pas !"
    caption obj%,"Sous-menu pas de curseur" : show obj%
    res% = dll_call2("ClickSetHook",handle(obj%),handle(302))
    hide 103 : show 104
   
'---------- movie
case 12
    color obj%,210,210,255 : show obj%
    res% = dll_call2("ClickSetHook",handle(obj%),handle(302))
    hide 103 : show 104
   
'---------- track_bar
case 13
    show obj%
    res% = dll_call2("ClickSetHook",handle(obj%),handle(302))
    hide 103 : show 104
   
'---------- scroll_bar
case 14
    position obj%,30 : show obj%
    res% = dll_call2("ClickSetHook",handle(obj%),handle(302))
    hide 103 : show 104
   
'---------- progress_bar
case 15
    position obj%,30 : show obj%
    res% = dll_call2("ClickSetHook",handle(obj%),handle(302))
    hide 103 : show 104
   
'---------- scene2d
case 16
    show obj%
    res% = dll_call2("ClickSetHook",handle(obj%),handle(302))
    hide 103 : show 104
   
end_select
return

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

avatar

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

MessageSujet: Re: Nouvelle DLL: intercepter clic gauche, double et droit !   Mer 25 Jan 2012 - 23:48

Klaus, penses-tu que tu pourrais faire une version concaténée de tes DLL pour n'en charger qu'une avec toutes les fonctions courantes que tu as ajouté ?

IPC.dll; Strings.dll ; Print.dll; IsRunning.dll ; SetWindowButtons.dll ; WebBrowser.dll ; WScript.dll; Histo.dll; ShowModal.dll ; SowModalBMP.dll; ClickIntercept.dll et Sapi.dll

Il est peu probable que les programmes utilisent toutes les fonctions de la DLL, mais c'est plus simple que de gérer toutes les combinaisons ou de jongler avec DynamicallyLoadDLL

Qu'en penses tu ?

PS: au fait, tu as oublié les dernières DLL en haut de ton doc word à l'endroit où tu listes les DLL
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
JL35



Nombre de messages : 5979
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: Nouvelle DLL: intercepter clic gauche, double et droit !   Jeu 26 Jan 2012 - 1:38

C'est bien le problème avec les dll, il finit par y en avoir un peu partout et ça devient difficile à gérer.
Evidemment, une bibliothèque dans laquelle on piocherait serait mieux sans doute, mais ça risque de faire un gros module et d'alourdir le code.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

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

MessageSujet: Re: Nouvelle DLL: intercepter clic gauche, double et droit !   Jeu 26 Jan 2012 - 3:07

@Jicehel:
Tu as raison: il faut que je modifie le haut de la doc pour cela.

@Jicehel et JL35:
A l'origine, c'est pour cela que j'avais créé KGF.dll. En fait, certaines de ces DLL sont extraites de KGF.dll, suite à une demande du forum pour avoir des DLLs plus petites. Mais c'est vrai que ça garde un intérêt d'avoir tout en semble, dans un même module. Je vais donc refaire une fusion de mes DLL dernière version pour les intégrer toutes dans KGF.dll.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Jicehel

avatar

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

MessageSujet: Re: Nouvelle DLL: intercepter clic gauche, double et droit !   Jeu 26 Jan 2012 - 15:34

Merci Klaus.

En effet, tu ne peux pas t'amuser à tout intégrer à chaque modif (à moins de disposer d'un système pour allonger le temps ...) mais c'est vrai que c'est pratique de faire cette fusion de temps à autre vu le fonctionnement de Panoramic Smile
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
exdragon

avatar

Nombre de messages : 601
Date d'inscription : 05/01/2012

MessageSujet: Re: Nouvelle DLL: intercepter clic gauche, double et droit !   Jeu 26 Jan 2012 - 16:16

Citation :
En effet, tu ne peux pas t'amuser à tout intégrer à chaque modif (à moins de disposer d'un système pour allonger le temps ...)

Par contre pourquoi pas un dossier "modules", dans lequel on y téléchargerais les nouvelles DLL et le programme utiliserait celle qu'il a besoin sans tout charger.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

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

MessageSujet: Re: Nouvelle DLL: intercepter clic gauche, double et droit !   Jeu 26 Jan 2012 - 17:13

@Exdragon: où est-ce que tu le vois, de dossier "modules" ? Sur mon site, je ne peux donner que des liens vers des fichiers individuels, d'où l'utilisation des ficjhier ZIP. Sur 4shared où j'ai un compte, je pourrais aisément le mettre en place, et chacun pourrait y piocher par FTP. L'ennui, si certains fichiers ne son pas téléchargés pendant un certain temps (3 mois, par exemple), ils sont simplement effacés. Le répertoire ne sera donc par vraiment complèt, à moins d'y recharger en permanence l'ensemble des fichiers. Ce n'est pas si évident que cela, ce que tu proposes, mais si tu as une solution, je suis prêt à l'entendre.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Invité
Invité



MessageSujet: Re: Nouvelle DLL: intercepter clic gauche, double et droit !   Jeu 26 Jan 2012 - 17:27

Klaus,
Pourquoi tu ne vas pas sur Host: si tu interviens pour rajouter ou modifier un fichier dans les 6 mois, rien n'ai retiré.
Mes premiers envois que j'ai mis il y a peut-être 2 ans, ils sont encore là, même sans y toucher. Et j'ai un compte gratuit!
Revenir en haut Aller en bas
Contenu sponsorisé




MessageSujet: Re: Nouvelle DLL: intercepter clic gauche, double et droit !   

Revenir en haut Aller en bas
 
Nouvelle DLL: intercepter clic gauche, double et droit !
Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 1 sur 2Aller à la page : 1, 2  Suivant

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: