[R] Appui sur une touche pour lancer une fonction

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
aulus
Niveau 7
Niveau 7
Messages : 424
Enregistré le : lun. 25 mars 2013 19:38
Status : Hors ligne

[R] Appui sur une touche pour lancer une fonction

#1

Message par aulus »

Bonjour,

Je souhaite que l'appui sur la touche DEL du clavier supprime une ligne d'un ListView, en lançant la fonction adéquate.

J'ai essayé la fonction HotKeySet("{DEL}", "fonctionDel") . Elle fonctionne très bien, ... même trop bien ! L'appui sur la touche DEL lance la fonction quelle que soit la GUI dans laquelle je me trouve. Elle conduit donc à des catastrophes !

J'ai essayé le code suivant, adaptation de l'exemple de l'aide à la fonction _IsPressed :

Code : Tout sélectionner

#include <Misc.au3>
Local $hDLL = DllOpen("user32.dll")

While 1
    If _IsPressed("2E", $hDLL) Then
         fonctionDel()
         ExitLoop
    EndIf
WEnd

DllClose($hDLL)
 
Avec ce code, le programme plante à l'ouverture du ListView.

Que faire ?

Je vous remercie.
Modifié en dernier par aulus le ven. 12 juil. 2013 18:25, modifié 3 fois.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] appui sur une touche pour lancer une fonction

#2

Message par mikell »

Dans la fonction du Hotkeyset il faudrait introduire des restrictions et vérifications
Sinon tu peux aussi essayer d'adapter à partir de ça

Code : Tout sélectionner

#include <GUIConstantsEx.au3>

GUICreate("test", 100, 50)
Local $btn = GUICtrlCreateButton(".", 150, 10)
Local $AccelKeys[1][2] = [["{DEL}", $btn]]
GUISetAccelerators($AccelKeys)
GUISetState() 

While 1
    $msg = GUIGetMsg()
    Select
        Case $msg = $btn
            MsgBox(0, "", "Suppr")
        Case $msg = $GUI_EVENT_CLOSE
            Exit
    EndSelect
Wend
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
aulus
Niveau 7
Niveau 7
Messages : 424
Enregistré le : lun. 25 mars 2013 19:38
Status : Hors ligne

Re: [..] Appui sur une touche pour lancer une fonction

#3

Message par aulus »

Bonsoir Mikell, et merci.

Ma GUI affiche une suite de pseudo-pages aux contrôles affichés puis cachés selon les besoins d'appels à diverses fonctions, et le code que vous avez proposé étend la fonction sur toutes les pseudos-pages de la GUI. Ce qui fait qu'il ne colle pas. Je voudrais en effet limiter l'utilisation de la touche DEL à la page affichant le listView.

Je réfléchis aux conditions accompagnant la fonction HotKeySet... C'est peut-être bien de cette manière que le problème peut être résolu.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Appui sur une touche pour lancer une fonction

#4

Message par mikell »

Tu n'es pas obligé de placer le Hotkeyset en tête de script, tu peux l'enregistrer lors de la sélection d'un item de la listview et le désenregistrer quand la listview perd le focus ^^
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Manox
Niveau 3
Niveau 3
Messages : 43
Enregistré le : mar. 18 déc. 2012 10:56
Status : Hors ligne

Re: [..] Appui sur une touche pour lancer une fonction

#5

Message par Manox »

Salut,

Si tu as besoin de l'hotkey juste pour la suppression d'un item dans une listview, tu peux passer par ce bout de code qu'il le fait très bien sans les utiliser.
► Afficher le texte
J'ai du le faire pour un de mes projets il y a quelques jours, là pour le coup j'ai repris l'exemple de création d'un LV dans l'helpFile.

En espérant que ça puisse aider.
Modifié en dernier par Manox le jeu. 11 juil. 2013 07:46, modifié 1 fois.
aulus
Niveau 7
Niveau 7
Messages : 424
Enregistré le : lun. 25 mars 2013 19:38
Status : Hors ligne

Re: [..] Appui sur une touche pour lancer une fonction

#6

Message par aulus »

Merci Mikell pour la précision que vous venez d'ajouter. On désenregistre comment ? Peut-être : HotKeySet("{DEL}", "") ?

Merci Manox pour ce code qui marche à merveille. Je vais le tester à l'intérieur de mon code.
Manox
Niveau 3
Niveau 3
Messages : 43
Enregistré le : mar. 18 déc. 2012 10:56
Status : Hors ligne

Re: [..] Appui sur une touche pour lancer une fonction

#7

Message par Manox »

Pour le "unset" un HotKeySet("{DEL}") suffit il me semble.
aulus
Niveau 7
Niveau 7
Messages : 424
Enregistré le : lun. 25 mars 2013 19:38
Status : Hors ligne

Re: [..] Appui sur une touche pour lancer une fonction

#8

Message par aulus »

Le code de Manox ne fonctionne pas lorsque je l'inclus dans mon code. Je pense que c'est dû à la différence de fonction de création de ListView choisie :

- Le code de Manox utilise la fonction de creation _GUICtrlListView_Create
- Mon code utilise la fonction GUICtrlCreateListView

Le désenregistrement du HotKeySet est bien HotKeySet("{DEL}") . J'ai bien tenté d'en semer en tête de toute les fonctions pour lesquelles le HotKeySet("DEL") n'est pas nécessaire, mais au moment où j'écris, je n'ai pas encore réussi. Encore quelques heures de travail...
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Appui sur une touche pour lancer une fonction

#9

Message par mikell »

Le code de Manox doit fonctionner avec toutes les listviews, il est prévu pour ça
► Afficher le texte
Il faut bien faire attention que le nom des variables est bon dans le WM_NOTIFY
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
aulus
Niveau 7
Niveau 7
Messages : 424
Enregistré le : lun. 25 mars 2013 19:38
Status : Hors ligne

Re: [..] Appui sur une touche pour lancer une fonction

#10

Message par aulus »

Voilà, j'y suis parvenu. Je m'étais emmêlé les pinceaux en ajoutant le Case $LVN_KEYDOWN au Case $LVN_COLUMNCLICK qui existait déjà dans mon Func WM_NOTIFY() et en ne modifiant pas les variables locales (comme vous l'aviez subodoré Mikell).

Merci Manox pour ce beau code efficace, et merci Mikell pour vos idées et conseils.

Je crois comprendre que le code 339 correspond à la touche DEL. Où peut-on trouver un tableau définissant les codes pour les autres touches (ENTER / INSER) ?
Manox
Niveau 3
Niveau 3
Messages : 43
Enregistré le : mar. 18 déc. 2012 10:56
Status : Hors ligne

Re: [..] Appui sur une touche pour lancer une fonction

#11

Message par Manox »

Très bonne question je sais pas si il existe une table avec ces infos... a voir donc ! :)

En attendant, voici une manière de trouver ces "codes"

rajoute ceci à la case $LVN_KEYDOWN
► Afficher le texte
il faut ensuite rajouter cette fonction a ton code :
► Afficher le texte
ceci t'affichera les codes Vkey et Flags pour certaines touches (malheureusement ça n'inclut pas le "enter" :()

Edit: tiré du helpfile je précise ^^
Modifié en dernier par Manox le ven. 12 juil. 2013 18:57, modifié 1 fois.
aulus
Niveau 7
Niveau 7
Messages : 424
Enregistré le : lun. 25 mars 2013 19:38
Status : Hors ligne

Re: [..] Appui sur une touche pour lancer une fonction

#12

Message par aulus »

Merci pour ce bon petit code.
En effet ENTER n'a pas droit à son code Flags.

Flags pour quelques autres touches :

INSER : 338
BACKSPACE : 14
BARRE D'ESPACEMENT : 57
CTRL : 29 (gauche) et 285 (droit)
ALT : 8248
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [R] Appui sur une touche pour lancer une fonction

#13

Message par mikell »

Cela dit c'est peut-être un meilleur plan de travailler directement avec les virtualkey codes, parce que toutes les valeurs figurent dans l'aide pour _IsPressed et tu les trouves partout sur internet
(au passage, une simple msgbox c'est pas mal non plus :mrgreen: )

Code : Tout sélectionner

             Case $LVN_KEYDOWN
                    $tInfo = DllStructCreate($tagNMLVKEYDOWN, $ilParam)
                    Local $flags = DllStructGetData($tInfo, "Flags")
                    Local $vkey = DllStructGetData($tInfo, "VKey")
                    ;msgbox(0,"", $flags &@crlf& $vkey)
                   Switch $vkey 
                        Case 0x2e  ; 339  ; DEL
                            ; etc
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
aulus
Niveau 7
Niveau 7
Messages : 424
Enregistré le : lun. 25 mars 2013 19:38
Status : Hors ligne

Re: [R] Appui sur une touche pour lancer une fonction

#14

Message par aulus »

Bonsoir Mikell,

Effectivement ENTER a son code, mais... c''est la seule touche qui ne produit aucune action !

Autre question : comment sélectionner un item d'une ListView ? J'ai essayé tout ce que j'ai pu trouver (enfin je le crois) dans l'aide _GUICtrlListView sans résultat :

Code : Tout sélectionner

_GUICtrlListView_ClickItem($myList, 1)
_GUICtrlListView_SetItemState($myList, 1, $LVIS_FOCUSED, $LVIS_FOCUSED)
_GUICtrlListView_SetItemFocused($myList, 1)
_GUICtrlListView_SetHotItem($myList, 1)
GUICtrlSetState($myList, $GUI_CHECKED)
 
Manox
Niveau 3
Niveau 3
Messages : 43
Enregistré le : mar. 18 déc. 2012 10:56
Status : Hors ligne

Re: [R] Appui sur une touche pour lancer une fonction

#15

Message par Manox »

@Mikell, en effet c'est bien mieux ! http://msdn.microsoft.com/en-us/library ... 85%29.aspx

Par contre, je préfère nettement passer un consoleWrite, pas besoin de cliquer ok pour chaque touche testée (dans ce contexte bien sur) et le code reste dans la console après coup :)

@aulus

As-tu essayé ceci ? :

Code : Tout sélectionner

_GUICtrlListView_SetItemSelected()
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [R] Appui sur une touche pour lancer une fonction

#16

Message par mikell »

Avec toutes ces udf on a une fâcheuse tendance à oublier les fonctions intégrées ^^
Je recommande un coup d'oeil à la fonction ControlListView qui est aussi efficace (souvent) et beaucoup plus légère (toujours)
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
aulus
Niveau 7
Niveau 7
Messages : 424
Enregistré le : lun. 25 mars 2013 19:38
Status : Hors ligne

Re: [R] Appui sur une touche pour lancer une fonction

#17

Message par aulus »

Bonjour,

Les fonctions :

Code : Tout sélectionner

_GUICtrlListView_SetItemSelected()
ControlListView ( "", "", $myList, "Select",2,2)
 
... signalent l'item indexé par un surlignage de couleur claire mais l'item n'est pas sélectionné (mémorisé) pour être envoyé à une fonction (auquel cas, le surlignage prend la couleur bleu foncé). C'est ce qui fait que ces fonctions, qui paraissent pourtant les plus adéquates, ne m'ont pas paru adaptées à ce que je souhaitais.

Merci Manox pour le lien vers le tableau de codes.

Et il reste ce satané ENTER qui ne veut rien entendre...
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [R] Appui sur une touche pour lancer une fonction

#18

Message par mikell »

A priori ce n'est pas l'item qui doit être envoyé à la fonction c'est son contenu, donc il faut le sélectionner puis le lire avec un GuiCtrlRead ou un GetText
Et la touche enter est réservée dans les listviews : pour tester, presse enter tout en ayant le bouton gauche de la souris pressé
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
aulus
Niveau 7
Niveau 7
Messages : 424
Enregistré le : lun. 25 mars 2013 19:38
Status : Hors ligne

Re: [R] Appui sur une touche pour lancer une fonction

#19

Message par aulus »

Oui, il s'agit bien du contenu de l'item.

Quant à la touche ENTER, j'en fais donc mon deuil...

Merci encore pour toutes les réponses.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [R] Appui sur une touche pour lancer une fonction

#20

Message par mikell »

Pour info, les touches TAB et ESC aussi, et je déconseille les flèches haut et bas
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Répondre