IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants VCL Delphi Discussion :

HookKeyboard remplacer touche enfoncée?


Sujet :

Composants VCL Delphi

  1. #1
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut HookKeyboard remplacer touche enfoncée?
    Bonsoir,

    Je viens d'installer le composant HookKeyBoard, et je voulais savoir comment faire pour rediriger la touche enfoncée verre une autre... par exemple, si on veut que sur l'appui de n'importe quel touche, apparaisse la lettre F Soit le code ASCII=70.

    J'ai essayé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TForm1.HookKeyboard1HookKeyDown(Sender: TObject; key: Word;
      ExtendedKey, AltKey, PrevPressed: Boolean);
    begin
      key:=70;
    end;
    Mais rien à faire, c'est quand meme la touche qui avait été enfoncée qui est prise en compte.

    Merci à vous !

  2. #2
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut
    En faite... pour que ça fonctionne bien, il faudrait que l'application capture la touche avant que windows l'interprete...

    J'en appel au professionnel de la programmation...

    Merci à vous !

  3. #3
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    Si le code de ton évènement est exact, la paramètre Key n'est pas passé par adresse mais par valeur. Tu ne pourras jamais changer la touche via cet évènement.

    Est-ce que tu veux que le remplacement se fasse dans ton application seulement ou dans toutes les applications lancées ?
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  4. #4
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut
    Et bien je voudrais que ça ce fasse dans toutes les applications...

    En faite, ce tuto rejoint un autre un peu différent que j'ai créer vas voir ici pour comprendre ce que je veux faire :

    http://www.developpez.net/forums/sho...d.php?t=536710

    Merci de ton aide.

  5. #5
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut
    En faite, pour que tout soit claire, je me réxplique :

    Je voudrais créer une boite avec des Interrupteurs sur lesquels seront branché des touches du clavier usb lorsqu'on activera un Interrupteur, on appuira donc sur une touche du clavier, Vous allez me dir :" pourquoi ne pas utiliser de simples boutons poussoir???" et bien c'est pour une question de réalisme...

    Donc, lorsque l'interrupteur sera activé, il faudra que mon application vienne bloquer les doublons de chaques touches. pour éviter "uuuuuuuuuuuuuuuu" de cette facon nous n'aurons que "u".

    Mais mon autre souci, c'est que windows ce retrouve saturé si j'appui plusieurs touche en même temp (les touches ne sont plus prise en compte au bout d'un certain nombre)... c'est pour ça que je dois capturer la touche appuyée avant que windows interprete le message, et la bloquer si besoin, vous comprenez?

    Par la suite (si c'est possible), il serait interéssent de personnaliser les boutons, c'est à dir, que si physiquement le bouton fait apparaitre la lettre "a", et bien mon appli poura enregistrer et rediriger l'action de la touche "a" vers une action défini par l'utilisateur.

    Voila vous savez tout...

    Hélàs je ne sais pas comment intercepter la touche clavier avant que windows l'interprete, et aussi rediriger l'action (si c'est possible)...

    Le mieu aurait été d'utiliser un PIC programmable et je jouer avec les niveaux logique de chaque bouton, mais c'est beaucoup trop compliqué pour moi, c'est pourquoi j'en revien à delphi.

    Merci de votre aide !

  6. #6
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    Fait une recherche sur les Hool Clavier, cela fait ce que tu veux. Par contre : si tu le gère pour toutes les aplications... ce sera toutes les applications ! Y compris dans l'explorateur, etc... Prevois un moyen simple et sur de desactiver ton système si tu veux reprendre la main.
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  7. #7
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut
    Hool Clavier? on à ça dans la FAQ? si tu as un lien, je suis preneur.

    Sinon, je recherche de mon coté.

  8. #8
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut
    J'ai trouvé ça :
    http://nono40.developpez.com/sources/source0007/

    Mais je suis pas sur qu'un Hook agira avant que windows interprete le message... si je me trompe, explique moi, car je comprend pas.

    Mais je ne comprend pas comment utiliser le grand code...

    Pourais tu m'aider car je débute... merci de m'aider.

  9. #9
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    Oui c'est bien avant que le message arrive avant l'application et soit traité.

    Débuter par un Hook qui impose une dll ne sera pas facile. Je n'ai pas le temps tout de suite de t'aider plus dans le détail. Sache que dans ton cas c'est le code de la dll qu'il faudra modifier, plus précisément la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Function KeyboardHook(code: Integer; wparam: WPARAM; lparam: LPARAM): LRESULT stdcall;
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  10. #10
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut
    Je ne vois pas comment je pourrais modifier la fonction, car je ne sais pas comment utiliser le code... est-ce un composant à installer?

    En fait j'aimerais comprendre le principe de la dll, est-ce que la dll est capable d'afficher un showmessage?

    Dans le code de la dll, je ne comprend pas à quoi correspond le code de la touche appuyé, je ne comprend pas comment est représenté la touche appuyée...

    Je suis perdu...

    Merci de m'expliquer (si c'est possible).

  11. #11
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    Ce ne n'est pas un composant à installer, il faut que tu modifies la dll avec tes besoins que que tu la lances après le projet à coté.

    Tu t'attaques à quelque chose de bien compliqué pour un début

    Je te conseille de commencer par lire http://msdn2.microsoft.com/en-us/lib...89(VS.85).aspx afin de comprendre quels sont les objets que tu manipules dans ce code.

    Dans ton cas dans la procédure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Function KeyboardHook(code: Integer; wparam: WPARAM; lparam: LPARAM): LRESULT stdcall;
    tu dois intépréter les valeurs de wParam et lParam pour savoir quelle est la touche appuyée et éventuellement changer la valeur que tu passes en sortie à CallNextHookEx. Pour savoir comment sont codées les touches dans wParam et lParam tu dois aller sur cette page http://msdn2.microsoft.com/en-us/lib...84(VS.85).aspx
    Ce n'est pas des codes directement en caractère, c'est en code virtuel de touche (constante VK_xxxxx dans Delphi)

    Dans le source donné en exemple, a priori dans ton appli tu veux virer ce qui concerna le Memory File Mapping car tu n'a pas besoin de retourner les touches à l'application.
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  12. #12
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut
    Tout cela me dépasse.

    Je vais me pencher sur le problem mais je pense que je n'y parviendrais pas.

  13. #13
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut
    Bonjour !

    Pour commencer par comprendre tout ça, j'ai modifier le code de la DLL pour créer un fichier Ini dans lequel je viens copier les infos de wparam et lparam,
    par exemple, si j'appuis sur la touche "a" j'ai comme info :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    wparam=65
    lparam=1048577
    Pourriez vous m'aider à décrypter ces deux valeur? J'ai bien été voir le lien que Nono40 m'as donné concernant le codage des touches Iparam et Lparam, mais ça ne m'en dit pas plus.

    Merci à vous !

  14. #14
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut
    J'avance un peu, mais je n'arrive pas à "Hacker" windows, c'est à dir à modifier la touche appuyée, voici ce que j'ai modifier (pour faire un test) dans la fonction Function KeyboardHook(code: Integer; wparam: WPARAM; lparam: LPARAM): LRESULT stdcall;
    :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    Function KeyboardHook(code: Integer; wparam: WPARAM; lparam: LPARAM): LRESULT stdcall;
    Var HandleFileLocal:Integer;
        PointeurLocal  :PKeyBuffer;
        Adresse        :Integer;
        IniTest        : TIniFile;
    Begin
      IniTest := TIniFile.Create(ExtractFilePath(Application.GetNamePath)+'\test.ini');
      HandleFileLocal:=OpenFileMapping(FILE_MAP_WRITE,False,'KEYHOOK');
      If HandleFileLocal<>0
      Then Begin
        PointeurLocal:=PKeyBuffer(MapViewOfFile(HandleFileLocal,FILE_MAP_WRITE,0,0,0));
        If PointeurLocal<>Nil
        Then Begin
        WParam:=65;
        LParam:=1048577;
        Adresse:=(PointeurLocal^.kbIN+1)And 127;
        PointeurLocal^.kbID [Adresse]:=GetCurrentProcessId;
        PointeurLocal^.kbKEY[Adresse]:=(WParam And $0000FFFF)+(LParam And     Longint($80000000));
        PointeurLocal^.kbIN          :=Adresse;
        UnMapViewOfFile(PointeurLocal);
        End;
      CloseHandle(HandleFileLocal);
    End;
    IniTest.WriteInteger('NomWPARAM','wparam',wparam);
    IniTest.WriteInteger('NomWPARAM','lparam',lparam);
    IniTest.WriteInteger('NomWPARAM','Code',code);
    Result:=CallNextHookEx(HandleHook,code,wparam,lparam);
    End;
    J'arrive pas à Imposer la touche "a" qui correspond à 65 ou 41 en Hexa...

  15. #15
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    Pour le détail des touches appuyées c'est ici
    http://msdn2.microsoft.com/en-us/lib...84(VS.85).aspx

    Pour la prise en compte du changement de touche, faut que je teste.
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  16. #16
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut
    Citation Envoyé par Nono40 Voir le message
    Pour la prise en compte du changement de touche, faut que je teste.
    Merci d'avance.

    Et sinon, pour ton lien, Je l'avais déjà visité, et la fonction :
    KeyboardProc
    N'apparait nul part dans la dll, faut-til que je l'ajoute?

    Que dois-je en faire?

    Merci de m'aider, (car je sais que tu n'as pas trop de temp.)

  17. #17
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    Non ne nom n'apparait pas car c'est un exempl de procédure de retour comme celle qui est dans le code. Mais ce n'est pas pour cela que je t'ai donné le lien.
    Les paramètres de cette fonction ont les même valeurs dans le code que je t'ai donné, comme cela tu as la définition de wParam et Lparam.

    Pour le test ce sera dés que j'ai quelques minutes.
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  18. #18
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut
    Pour le WParam, j'ai compris, mais le IParam, ça me parait compliqué...

    Merci de me tenir au courant pour tes éssais !

  19. #19
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Points : 915
    Points
    915
    Par défaut
    J'avais ecrit un petit programme pour bloquer certaines touches.
    Sur Windows 2000 ca fonctionnait bien ...

    Tu peux le modifier comme tu veux...
    Fichiers attachés Fichiers attachés
    Comment dupliquer un disque...ça vous intéresse?
    Tutoriel et code source delphi ici

  20. #20
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut
    Merci, mais ce codes est trop compliqué pour moi.

    Je pense que je vais baisser les bras, car je suis litérallement noyé.

    Merci quand même...

Discussions similaires

  1. Réponses: 5
    Dernier message: 18/11/2009, 16h44
  2. [WD12] Touche enfoncée sur colonne de table
    Par Gaetch dans le forum WinDev
    Réponses: 17
    Dernier message: 21/04/2009, 14h27
  3. [WD11] touches enfoncées
    Par cdsoft dans le forum WinDev
    Réponses: 3
    Dernier message: 15/07/2008, 16h33
  4. Detection des touches enfoncées par API
    Par Ingham dans le forum VB 6 et antérieur
    Réponses: 31
    Dernier message: 20/02/2006, 12h30
  5. [Forms6i]touche enfoncée
    Par asnf dans le forum Forms
    Réponses: 6
    Dernier message: 02/01/2004, 16h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo