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

API, COM et SDKs Delphi Discussion :

Hook Clavier et changement de touche


Sujet :

API, COM et SDKs Delphi

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2003
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Hook Clavier et changement de touche
    Bonjour ,

    Voilà apres des recherches sur ce forum, j'ai pu trouvé des sources de Sub0 il me semble sur un hook clavier ou alors c'est de nono dans un post de sub0, bref..

    ce hook marche nickel je detecte très bien les touches pressés
    maitenant j'ai un autre problème qui est que je voudrais que si la touche pressé est celle que je desire (definit par l'utilisateur), elle soit remplacé par une autre (définit elle aussi par l'utilisateur)
    j'ai donc fait d'autre recherche et j'ai trouvé SendMessage(),
    j'ai donc reussi à recuperer le Handle de la fenêtre desiré, à terme ce sera toujours la même fenêtre
    pour le moment j'ai donc crée un fichier texte et je l'ouvre avec bloc notes je recupere le handle de la fênêtre du bloc note (il est bien valide je pense)
    seulement je voudrais que par exemple si la personne tape dans le bloc notes la lettre a, ça ne soit pas celle-ci qui soit ecrite dans le fichier mais z par exemple
    et via SendMessage() ça ne fonctionne pas, ou alors je m'y prends mal

    je vous demande donc si de un c'est bel et bien possible à faire, et de deux si vous savez m'aiguiller ou si il existe même de sources la dessus, car j'ai rien trouvé qui traite de mon probleme, en fait j'ai trouvé un post ici mais sans reponse apparemment cette personne cherchait la même chose que moi .. c'est balo :o

    je precises que ce programme n'as rien d'illegal ou quoi que ce soit d'autre (piratage et compagine), c'est à court therme pour utiliser dans un logiciel et un jeu

    voilà,
    merci d'avance à ceux qui sauront/pourrons m'aider

  2. #2
    Membre confirmé
    Avatar de lil_jam63
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 447
    Points : 600
    Points
    600
    Par défaut
    essaye en utilisant keydb_event au lieu de sendmessage().

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2003
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par lil_jam63
    essaye en utilisant keydb_event au lieu de sendmessage().
    oui mais je ce que je voudrais c'est que la touche appuyé elle ne soit pas executée
    or là ça va l'executer et ensuite je me sers de keybd_event,
    en fait à terme ça serait carrement pour que cette touche ne soit pas du tout interpreté
    par exemple j'ai le handle de la fenetre
    et je veux desactiver une touche si elle a etait deja pressé une fois et qu'un autre elle ne l'as pas etait (pressé) entre temps
    en gros en schematique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    si j'appui sur A 
       tant que j'ai pas appuyé sur B alors 
          rendre A est inactif (je l'intercepte mais elle n'est pas envoyé au moins à la fenetre dont j'ai le handle)
      Si B est appuyé, Alors A redeviens actif
    en trés schematique ça reviens à desactiver une touche si elle a dejà etait pressé une fois, et tant qu'une autre touche (definie) n'as pas été appuyé et si c'est le cas alors on reactive la premiere touche

  4. #4
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Salut!

    http://sub0.developpez.com/delphi/HookDll.dpr
    http://sub0.developpez.com/delphi/hook_bb.zip

    Le code suivant fonctionne ainsi;
    En appuyant sur la touche B, tu bloques/débloques le clavier...
    Dans OnWmCopyData, tu peux tout de même récupérer le code de la touche appuyée.
    Ajoute un memo à la form pour voir la saisie du clavier...
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    UNIT Unit1;
     
    {----------------------------------------------------------------}
    {                         }INTERFACE{                            }
    {----------------------------------------------------------------}
    USES Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,
         Forms,Dialogs,ExtCtrls,StdCtrls;
     
    CONST HookDll='HOOKDLL.DLL';
     
    TYPE
      TProcCallBack=PROCEDURE(Msg:Integer);STDCALL;
      TForm1=CLASS(TForm)
        PROCEDURE FormDestroy(Sender: TObject);
        PROCEDURE FormCreate(Sender: TObject);
        PROCEDURE OnWmCopyData(var msg:TMessage);MESSAGE WM_COPYDATA;
      END;
      TKeyState=RECORD
        ExtendedKey,Alt,PrevPressed,Pressed:Boolean;
      END;
     
    VAR Form1:TForm1;
        MouseHookStruct:TMouseHookStruct;
     
      PROCEDURE FinalisationHook;STDCALL;EXTERNAL HookDll;
      FUNCTION InitialisationHook(HandelDestData:HWnd):Boolean;STDCALL;EXTERNAL HookDll;
      FUNCTION GetEtatTouche(from:Longint):TKeyState;
     
     
    {----------------------------------------------------------------}
    {                       }IMPLEMENTATION{                         }
    {----------------------------------------------------------------}
    {$R *.DFM}
     
    TYPE
      TPDataEnvoyes=^TDataEnvoyes;
      TDataEnvoyes=PACKED RECORD
        Key:WPARAM;
        State:LPARAM
      END;
     
    VAR passkey,Keyreaded:Integer;
        Keypressed:Boolean;
        Permission:Boolean;
     
     
    {----------------------------------------------------------------}
    FUNCTION bit(bitnum:Integer;int:Longint):Boolean;
    BEGIN Result:=(int AND(Cardinal(1)SHL(bitnum-1)))>0;END;
     
    {----------------------------------------------------------------}
    FUNCTION GetEtatTouche(from:Longint):TKeyState;
    BEGIN
     Result.Alt:=bit(30,from);
     Result.ExtendedKey:=bit(25,from);
     Result.PrevPressed:=bit(31,from);
     Result.Pressed:=NOT bit(32,from);
    END;
     
     
    {----------------------------------------------------------------}
    { KEYBOARD INTERRUPT                                             }
    {----------------------------------------------------------------}
    PROCEDURE TForm1.OnWmCopyData(var msg:TMessage);
     
    TYPE  TPCopyDataStruct=^TCopyDataStruct;
          TPDataEnvoyes=^TDataEnvoyes;
     
    VAR   DataEnvoyes:TDataEnvoyes;
          PDataEnvoyes:TPDataEnvoyes;
          PCopyDataStruct:TPCopyDataStruct;
          KeyState:TKeyState;
     
    BEGIN
      PCopyDataStruct:=TPCopyDataStruct(msg.LParam);
      PDataEnvoyes:=PCopyDataStruct^.lpData;
      DataEnvoyes:=PDataEnvoyes^;
      KeyState:=GetEtatTouche(DataEnvoyes.State);
      PassKey:=DataEnvoyes.State;
      Keypressed:=KeyState.Pressed;
      KeyReaded:=DataEnvoyes.Key;
      IF(Keypressed)AND(KeyReaded=ord('B'))THEN Permission:=NOT Permission;
      msg.Result:=1;
      IF(Permission)THEN msg.Result:=0;
    END;
     
     
    {----------------------------------------------------------------}
    { FORM DESTROY                                                   }
    {----------------------------------------------------------------}
    PROCEDURE TForm1.FormDestroy(Sender: TObject);
    BEGIN FinalisationHook;END;
     
     
    {----------------------------------------------------------------}
    { FORM CREATE                                                    }
    {----------------------------------------------------------------}
    PROCEDURE TForm1.FormCreate(Sender: TObject);
    BEGIN FinalisationHook;
     IF NOT(InitialisationHook(Handle))THEN BEGIN
      ShowMessage('Erreur à la création du Hook!');HALT;END;
     Permission:=True;
    END;
     
     
    {----------------------------------------------------------------}
    END.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2003
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Et voilà c'est nickel
    ça marche impecable, j'ai juste du modifier une partie mais ça marche impecable
    merci encore

  6. #6
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    J'ai trouvé ça en cherchant au hasard... Mais j'ai testé avant de te donner la solution qu'en même. Par contre, je suppose que si tu veux remplacer une touche par une autre, tu devras la bloquer, et envoyer au système, les messages d'appui et relachement de la touche qui remplace... Tout ce code devra se trouver dans la procédure OnWmCopyData je suppose, à+


  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2003
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    pour info pour bloquer une touche et pas toute les autres voilà ce qu'il a fallu changer
    le numero de la touche venant de deux TEdit:
    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
      if ( Edit1.Text <> '' ) then
          crouchpos := StrToInt(Edit1.Text); //pas de verif que c'est bien un integer
     
      if (Edit2.Text <> '' ) then
          raisepos := StrToInt(Edit2.Text);
     
      if ( keypressed ) then
        begin
          if (keyreaded = crouchpos) then //si c'est la touche que l'on ne veut pas appuyer deux fois
            begin
              if ( crouchpressed ) then //si ça a deja etait appuyé on bloque
                 msg.Result := 1
              else crouchpressed := True; 
            end
            else if ( keyreaded = raisepos ) then //si on appuie la touche que l'on veut
              if ( crouchpressed ) then
                 crouchpressed := False; //on reactive l'autre
     
        end
      else msg.Result := 0; //sinon on touche pas
    rien de bien compliqué mais encore merci ça marche au poil

    c'est reglé

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Win32 API] Hook clavier combinaison de touches
    Par Trunks dans le forum Windows
    Réponses: 3
    Dernier message: 27/11/2010, 13h23
  2. Réponses: 1
    Dernier message: 02/09/2009, 14h37
  3. [hook] Récuperer les valeurs des touches clavier
    Par TylerKnoxx dans le forum Windows
    Réponses: 0
    Dernier message: 09/12/2008, 11h06
  4. hook clavier vs touches système WINDOWS
    Par konfo dans le forum C++Builder
    Réponses: 5
    Dernier message: 14/09/2008, 14h43
  5. [Hook] Clavier Microsoft office keyboard
    Par merzhin dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 01/06/2004, 13h59

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