PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2025 → intercepter la touche <F1> ... ?
intercepter la touche <F1> ... ?
Iniciado por Michel, 05,nov. 2018 10:48 - 8 respuestas
Miembro registrado
127 mensajes
Publicado el 05,noviembre 2018 - 10:48
Bonjour,

Je cherche, à partir d'une appli WINDEV à intercepter la touche <F1> depuis n'importe quelle application 'non WINDEV' dans Windows (10) ; ce que j'ai réalisé avec le code suivant :

NB_0 : j'ai simplement remplacé la PROCÉDURE Incrémenter() dans la fenetre < FEN_thread.wdw > de l'exemple < Exemple d'un thread > avec ce qui suit (cf. le code ci-infra)

Cette procédure [ PROCÉDURE Incrémenter() ] est appelée par l'instruction :
< ThreadExécute("monthread",threadNormal,Incrémenter) >

NB_1 : je découvre les threads, services et autres API windows ...

Procedure Incrémenter()

// PROCÉDURE Incrémenter() : dans la fenêtre < FEN_thread.wdw > de l'exemple < Exemple d'un thread >
// NB : VK_F1 = 0x70 = F1 key

TANTQUE Vrai
RetourFonction est un entier
RetourFonction=API("USER32", "GetAsyncKeyState", 0x70)

IF RetourFonction = 0x8000 THEN
Trace("OK")
SORTIR

END
FIN

Trace("Sortie après <F1>")
btArrêter..Visible=Faux
btExécuter..Visible=Vrai


1ère question : n'y aurait-il pas une façon plus élégante pour intercepter cette touche <F1> (thread mieux implémenté, service ... ) ; méthode, entre autres, moins gourmande en ressources que la mienne ?
2e question : cette interception fonctionne très, voire trop bien : j'ai bien l'affichage des Trace("OK") et ("Sortie après <F1>") mais ce F1 appelle AUSSI l'aide de l'application (fenêtre) Windows en cours (Thunderbird, ... y compris l'aide de Windev lui-même ... !?). Comment neutraliser l'appel de F1 suite à l'interception par le thread ?
NB_z : je tiens à cette touche < F1 > ...

Vous remerciant,

Mike

--
-> Soyez indulgents : je ne suis pas programmeur !
-> Merci aux victimes du 'syndrome Coluche' (*) de s'abstenir ...
(*) « Écrivez nous de quoi vous avez besoin, on vous expliquera comment vous en passer ! » _ Coluche.
Miembro registrado
1.002 mensajes
Publicado el 05,noviembre 2018 - 11:47
Bonjour,

VK_F1 est un entier = 0x70
nTouche est un entier = VK_F1 // Touche F1
// Vérifie si la touche F1 a changé d'état depuis le dernier appui
SI ToucheEnfoncée(nTouche, Faux) ALORS
// Insérer ici le traitement à effectuer
FIN


Jordan
Miembro registrado
1.173 mensajes
Publicado el 05,noviembre 2018 - 12:34
Bonjour,

//Dans le code initialisation du projet
EXTERNE "KeyConst.WL"
EXTERNE "WinConst.WL"



//Dans ton traitement -- VK_F1 est une constante définit dans les liens Externes
SI ToucheEnfoncée(VK_F1) ALORS

FIN
Miembro registrado
81 mensajes
Publicado el 05,noviembre 2018 - 15:04
THIERRY TILLIER a écrit :
Bonjour,

//Dans le code initialisation du projet
EXTERNE "KeyConst.WL"
EXTERNE "WinConst.WL"



//Dans ton traitement -- VK_F1 est une constante définit dans les liens Externes
SI ToucheEnfoncée(VK_F1) ALORS

FIN



il veut intercepter le F1 dans un autre appli que son appli windev.

en gros son appli windev tourne en tache de fond.

il est sur par exemeple firefox, et clic sur f1.

là son appli windev intercepte le f1 et fait ce qu'elle a à faire.

il veut que en plus ça ne fasse pas le f1 prévu dans firefox.


pour la premiere partie je dis ok , il a deja une solution...
effectivement faut un thread qui tourne en tache de fond avec un tantque

jeboucle est un booleen = vrai
tantque jeboucle

SI ToucheEnfoncée(VK_F1) ALORS
jeboucle = faux
sortir
FIN
fin

// code à faire pour le F1



la fonction ToucheEnfoncée ça marche pas mal...
http://doc.pcsoft.fr/?3014007&lang=fr-FR&productversion=01F230053k

mais empecher le f1 de l'appli en cours moi là je seche...
Mensaje modificado, 05,noviembre 2018 - 15:05
Publicado el 05,noviembre 2018 - 16:06
Bonjour,
Laisser Windows gérer l'événement en utilisant la fonction "RegisterHotKey"


//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//Utilisation de la classe cmHotkey
PROCÉDURE MaFenêtre()

gcmH est cmHotkey("_EventF1")
gnAtom est entier sur 8 octets

//Créer 2 boutons On, Off
et appeler EventF1_On() ou EventF1_Off()

//---------------------
PROCÉDURE EventF1_On()

EventF1_Off()
gnAtom = gcmH.nAjouterHotKey("F1", Vrai, Faux, Faux)

//---------------------
PROCÉDURE EventF1_Off()

SI gnAtom > 0 ALORS
gcmH.SupprimerHotKey(gnAtom)
gnAtom = 0
FIN

//---------------------
PROCÉDURE _EventF1()

Trace("F1")
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<



//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Cette classe permet d'ajouter/supprimer des HotKeys
cmHotKey est une Classe
m_sProcédure est une chaîne // Procédure appelée à chaque détection de HotKey
m_bEvtBranché est un booléen // Flag interne
FIN

CONSTANTE
MOD_ALT = 0x1
MOD_CONTROL = 0x2
MOD_SHIFT = 0x4
WM_HOTKEY = 0x312
FIN

//---------------------------------------------------------------------------------------
PROCÉDURE Constructeur(psProcédure)
// psProcédure est la procédure à appeler lors d'une détection de HotKey

:m_sProcédure = psProcédure


//---------------------------------------------------------------------------------------
PROCÉDURE nAjouterHotKey(psTouche, pbCtrl, pbAlt, pbShift)
// psTouche est la touche principale
// pbCtrl est à vrai si la touche CTRL doit être enfoncée
// pbAlt est à vrai si la touche ALT doit être enfoncée
// pbShift est à vrai si la touche SHIFT doit être enfoncée
// Renvoie l'identifiant de la HotKey

nControl est un entier
nAtom est un entier
nAscTouche est un entier

// Touches de contrôle
SI pbCtrl nControl += ::MOD_CONTROL
SI pbAlt nControl += ::MOD_ALT
SI pbShift nControl += ::MOD_SHIFT

// Touche de 1 caractère
SI Taille(psTouche)=1 ALORS
// Code ASCII de la touche
nAscTouche = Asc(psTouche)

SINON
SELON psTouche
CAS "F1"
nAscTouche=112
CAS "F2"
nAscTouche=113
CAS "F3"
nAscTouche=114
CAS "F4"
nAscTouche=115
CAS "F5"
nAscTouche=116
CAS "F6"
nAscTouche=117
CAS "F7"
nAscTouche=118
CAS "F8"
nAscTouche=119
CAS "F9"
nAscTouche=120
CAS "F10"
nAscTouche=121
CAS "F11"
nAscTouche=122
CAS "F12"
nAscTouche=123
FIN
FIN

// Détermination d'un numéro unique pour la HotKey
nAtom = AppelDLL32("Kernel32.dll", "GlobalAddAtomA", psTouche+pbCtrl+pbAlt+pbShift)

// Ajout de la HotKey
AppelDLL32("User32.dll","RegisterHotKey", Handle(FenEnCours()), nAtom, nControl, nAscTouche)

// si l'événement n'a pas encore été branché
SI :m_bEvtBranché=Faux ALORS
:EvénementHotKey()
FIN

RENVOYER nAtom

//---------------------------------------------------------------------------------------
PROCÉDURE SupprimerHotKey(pnAtom est entier sur 8 octets)

// Fin de capture de Hotkey
AppelDLL32("User32.dll", "UnregisterHotKey", Handle(FenEnCours()), pnAtom)


PROCÉDURE EvénementHotKey()

// A chaque détection d'un HotKey, la procédure :m_sProcédure est appelée
Evénement(:m_sProcédure, "*.*", ::WM_HOTKEY)

:m_bEvtBranché = Vrai
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Miembro registrado
81 mensajes
Publicado el 05,noviembre 2018 - 16:30
:o

tout simplement.

Christian, mes respects.
Miembro registrado
127 mensajes
Publicado el 05,noviembre 2018 - 18:28
Merci à tous pour vos réponses.
Je résume :
Mon thread 'convient' ; à reformuler peut-être, mais il n'y a pas lieu de le remplacer par un 'service' ou autre moulinette plus adaptée ?
La neutralisation de <F1> suite à l'interception par le thread restant le gros morceau ...

il n'y a plus qu'à digérer tout cela (Prix spécial 'Alka-Seltzer' pour la classe de l'ami Christian, mais étudier ceci ne pourra que me faire progresser ... et peut-être trouver ma solution).

Encore un grand MERCI pour votre aide !

Mike

PS : Christian, comment intégrer ta suggestion à mon 'projet' ?

--
• Soyez indulgents : je ne suis pas programmeur !
• Merci aux victimes du 'syndrome Coluche' (*) de bien vouloir s'abstenir ...
(*) « Écrivez nous de quoi vous avez besoin, on vous expliquera comment vous en passer ! » _ Coluche.
Mensaje modificado, 05,noviembre 2018 - 18:37
Publicado el 06,noviembre 2018 - 09:37
Bonjour,

créer une classe vierge, puis créer les procédures indiquées et enfin copier-coller aux emplacement adéquats.
(Exception faite de la procédure Constructeur qui est créée automatiquement lors de la création de la classe)

Cependant, la création d'une classe n'est pas indispensable :

1/ Dans les déclarations globales de la fenêtre copier le code ci-dessous <<<<<<<<<<<<
CONSTANTE
MOD_ALT = 0x1
MOD_CONTROL = 0x2
MOD_SHIFT = 0x4
WM_HOTKEY = 0x312
FIN

gnAtomF1 est entier sur 8 octets
gnEventF1 est entier


2/ Créer les 3 procédures suivantes <<<<<<<<<<<<
-----------------------------------------------------------------
Procedure _EventF1()

Trace("F1")


-----------------------------------------------------------------
Procedure Event_F1_On()

SI gnAtomF1 > 0 ALORS RENVOYER Faux

soit sTouche = "F1" //<<<<<<<<<<<
gnEventF1 = Evénement("_EventF1", "*.*", WM_HOTKEY)

// Touches de contrôle
soit bCtrl = Vrai
soit bAlt = Faux
soit bShift = Faux

nControl est un entier
SI bCtrl = Vrai ALORS nControl += MOD_CONTROL
SI bAlt = Vrai ALORS nControl += MOD_ALT
SI bShift = Vrai ALORS nControl += MOD_SHIFT

nAscTouche est un entier
// Touche de 1 caractère
SI Taille(sTouche) = 1 ALORS
// Code ASCII de la touche
nAscTouche = Asc(sTouche)
SINON
SELON sTouche
CAS "F1"
nAscTouche=112
CAS "F2"
nAscTouche=113
CAS "F3"
nAscTouche=114
CAS "F4"
nAscTouche=115
CAS "F5"
nAscTouche=116
CAS "F6"
nAscTouche=117
CAS "F7"
nAscTouche=118
CAS "F8"
nAscTouche=119
CAS "F9"
nAscTouche=120
CAS "F10"
nAscTouche=121
CAS "F11"
nAscTouche=122
CAS "F12"
nAscTouche=123
FIN
FIN
// Détermination d'un numéro unique pour la HotKey
gnAtomF1 = AppelDLL32("Kernel32.dll", "GlobalAddAtomA", sTouche + bCtrl + bAlt + bShift)

// Ajout de la HotKey
AppelDLL32("User32.dll","RegisterHotKey", Handle(FenEnCours()), gnAtomF1, nControl, nAscTouche)
RENVOYER Vrai


-----------------------------------------------------------------
Procedure Event_F1_Off()

SI gnAtomF1 > 0 ALORS
// Fin de capture de Hotkey
AppelDLL32("User32.dll", "UnregisterHotKey", Handle(FenEnCours()), gnAtomF1)
gnAtomF1 = 0

FinEvénement(gnEventF1)
gnEventF1 = 0
FIN


etc...
Bonne journée...
Miembro registrado
127 mensajes
Publicado el 06,noviembre 2018 - 15:24
Merci Christian pour ces explications détaillées ; j’étudie tout ça dès que mon activité 'princeps' me laisse un moment ...

Pour la petite histoire, cette 'quête' s'inscrit dans le projet décrit ici :
https://forum.pcsoft.fr/fr-FR/pcsoft.fr.windev/205446-saisie-possible-dans-controle-fenetre-windows/read.awp…
... plus d'informations si le projet pique ta curiosité ...
J'aurai comme autre besoin une fenêtre Windev à géometrie 'variable et minimale' c.à.d. s'adaptant pile-poil à la taille de la liste 'popup' (appelée par notre <F1> ... ) qui s'affichant, permettra le choix de la chaine à injecter dans n'importe quel contrôle d’édition d'un programme Windows (*). Mais ceci est une autre histoire ...

(*) J'ai bricolé ça en interne à un programme FoxPro DOS ; je m'en sers en permanence ( Eh oui ... ) et ça marche du feu de dieu : 17 809 mots et expressions 'métier' disponibles dans mon 'glossaire' ... Indispensable !)

Encore merci à toi ; j’essaierai aussi de faire fonctionner ta classe ...

Mike

--
• Soyez indulgents : je ne suis pas programmeur !
• Merci aux victimes du 'syndrome Coluche' (*) de bien vouloir s'abstenir ...
(*) « Écrivez nous de quoi vous avez besoin, on vous expliquera comment vous en passer ! ». Coluche.