|
| 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()
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 SI ToucheEnfoncée(nTouche, Faux) ALORS FIN
Jordan |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 1.173 mensajes |
|
| Publicado el 05,noviembre 2018 - 12:34 |
Bonjour,
EXTERNE "KeyConst.WL" EXTERNE "WinConst.WL"
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 |

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)
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 SI Taille(sTouche) = 1 ALORS 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 gnAtomF1 = AppelDLL32("Kernel32.dll", "GlobalAddAtomA", sTouche + bCtrl + bAlt + bShift)
AppelDLL32("User32.dll","RegisterHotKey", Handle(FenEnCours()), gnAtomF1, nControl, nAscTouche) RENVOYER Vrai
-----------------------------------------------------------------
Procedure Event_F1_Off()
SI gnAtomF1 > 0 ALORS 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. |
| |
| |
| | | |
|
| | | | |
| | |
|