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

 Delphi Discussion :

Hook clavier


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 616
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 616
    Par défaut Hook clavier
    Bonsoir à toutes et à tous,

    Encore un hook !, voici ma question, est t'il possible de bloquer la combinaison des touches Alt+Shift+Numlock ?

    J'ai déjà tout vu sur le Hook, et j'ai testé toutes les combinaisons comme Alt+Ctrl+Delete, Alt+Tab etc..

    Cela fonctionne mais pas pour la combinaison des touches Alt+Shift+Numlock.

    Ce sont peut être des touches protégées ?

    Si quelqu'un avait une idée.

    @+,

    Cincap

  2. #2
    Membre émérite
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Par défaut
    voici un exemple pour intercepter le LOCKNUM a toi de l'adapter pour ton cas
    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
    var
      Form1: TForm1;
      HookID: HHook;
    implementation
    {$R *.dfm}
    function KeyboardProc(nCode: Integer; wParam, lParam: Longint): Longint; stdcall;
    begin
      if nCode < 0 then
          Result := CallNextHookEx(HookID, nCode, wParam, lParam)
      else
      case wParam of
        VK_NUMLOCK: Result := HC_SKIP;
            //WM_xx:
            // WM_xx:
       else
              Result := CallNextHookEx(HookID, nCode, wParam, lParam);
       end;
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
       HookID := SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, 0, GetCurrentThreadId());
    end;

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 616
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 616
    Par défaut
    Bonjour à toutes et à tous,

    @ Zutatous, merci de ta réponse, j'arrive bien à intercepter les touches mais pas de bloquer au moins une !

    J'avais une autre fonction qui est sensiblement la même :

    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
     
    function KeyboardProc(nCode: Integer; wParam: Longint; lParam: Longint): Longint; stdcall;
    var IsAltPressed, IsCtrlPressed, IsShiftPressed: Boolean;
    begin
      if ((lParam and (1 shl 29)) <> 0) then
        IsAltPressed := True
      else
        IsAltPressed := False;
      if ((GetKeyState(VK_CONTROL) and (1 shl 15)) <> 0) then begin
        IsCtrlPressed := True ;
        showmessage('Ok touche Ctrl pressée')
        end
      else
        IsCtrlPressed := False;
      if ((GetKeyState(VK_SHIFT) and (1 shl 15)) <> 0) then begin
        IsShiftPressed := true ;
        showmessage('Ok touche Shift pressée')
        end
      else
        IsShiftPressed := False;
      if ((GetKeyState(VK_MENU) and (1 shl 15)) <> 0) then begin
        IsCtrlPressed := True ;
        showmessage('Ok touche Alt pressée')
        end
      else
        IsCtrlPressed := False;
      if ((GetKeyState(VK_NUMLOCK) and (1 shl 15)) <> 0) then begin
        IsCtrlPressed := True ;
        showmessage('Ok touche NumLock pressée')
        end
      else
        IsCtrlPressed := False;
      if lParam > 0 then Shift := IsShiftPressed ;
      Result := CallNextHookEx(KeyboardHook, nCode, wParam, lParam);
    end;
    A ce stade, il manque le blocage par contre la reconnaissance de l'appui sur les touches voulues est ok

    @+,

    Cincap

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 938
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 938
    Par défaut
    Il ne faut simplement pas appeler CallNextHookEx si tes 3 touches sont pressées.

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 616
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 616
    Par défaut
    @ AndNotOr, merci de ta réponse, j'avais testé avec "SetWindowsHookEx " ou valeur "1" mais sans succès !.

    Maintenant, j'analyse les fonctions que j'ai.

    @+,

    Cincap

  6. #6
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Par défaut
    Salut,

    voici ma contribution :



    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
     
        procedure ProcMess(Var msg: TMsg; Var Handled: Boolean);
      private
        { Private declarations }
      Public
        { Public declarations }
      end;
     
     
    Var
      Etatkb:Array[0..255]of Boolean;
     
    Implementation
     
     
    procedure TFTravail.ProcMess(Var msg: TMsg; Var Handled: Boolean);
    Begin
        If(msg.Message=WM_KEYDOWN)THEN Etatkb[msg.wparam]:=True;
        If(msg.Message=WM_KEYUP)THEN Etatkb[msg.wparam]:=False;
     
    // Msg.xxxxx
     
    end;
    Exemple d'utilisation


    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
        if (not EtatKb[18]) then // touche ALTà été enfoncée evite le probleme du ALTGR qui vaut le CTRL+ALT
        Begin
          if (Etatkb[VK_CONTROL]) and (Etatkb[84]) then // CTRL + T
          begin
     
    // ... traitement
     
            EtatKb[VK_CONTROL] := False;
            EtatKb[84] := False;
          end
          else
          begin
            if (Etatkb[VK_CONTROL]) and (Etatkb[66]) then // CTRL + B
            Begin
    // ... traitement
     
              EtatKb[VK_CONTROL] := False;
              EtatKb[66] := False;
            end
          end;
        end
        else
        begin
          EtatKb[18] := False;
          Etatkb[VK_CONTROL] := False;
        end;
      end;
    Bye

  7. #7
    Membre émérite
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Par défaut
    Citation Envoyé par cincap Voir le message
    Bonjour à toutes et à tous,

    @ Zutatous, merci de ta réponse, j'arrive bien à intercepter les touches mais pas de bloquer au moins une !

    J'avais une autre fonction qui est sensiblement la même :

    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
     
    function KeyboardProc(nCode: Integer; wParam: Longint; lParam: Longint): Longint; stdcall;
    var IsAltPressed, IsCtrlPressed, IsShiftPressed: Boolean;
    begin
      if ((lParam and (1 shl 29)) <> 0) then
        IsAltPressed := True
      else
        IsAltPressed := False;
      if ((GetKeyState(VK_CONTROL) and (1 shl 15)) <> 0) then begin
        IsCtrlPressed := True ;
        showmessage('Ok touche Ctrl pressée')
        end
      else
        IsCtrlPressed := False;
      if ((GetKeyState(VK_SHIFT) and (1 shl 15)) <> 0) then begin
        IsShiftPressed := true ;
        showmessage('Ok touche Shift pressée')
        end
      else
        IsShiftPressed := False;
      if ((GetKeyState(VK_MENU) and (1 shl 15)) <> 0) then begin
        IsCtrlPressed := True ;
        showmessage('Ok touche Alt pressée')
        end
      else
        IsCtrlPressed := False;
      if ((GetKeyState(VK_NUMLOCK) and (1 shl 15)) <> 0) then begin
        IsCtrlPressed := True ;
        showmessage('Ok touche NumLock pressée')
        end
      else
        IsCtrlPressed := False;
      if lParam > 0 then Shift := IsShiftPressed ;
      Result := CallNextHookEx(KeyboardHook, nCode, wParam, lParam);
    end;
    A ce stade, il manque le blocage par contre la reconnaissance de l'appui sur les touches voulues est ok

    @+,

    Cincap

  8. #8
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 938
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 938
    Par défaut
    HC_SKIP pourquoi pas ! Mais dans le cas d'un hook clavier, il faut simplement renvoyer une valeur différente de 0.

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 616
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 616
    Par défaut
    @ tous, merci, je m'en vais tester cela.

    @ AndNotOr, j'ai essayé avec un hook complet du clavier et la combinaison "Alt+Shift+NumLock" ne semble pas bloquée, de même avec la valeur différente de 0.

    Je vous tiens au courant bien entendu.

    @+,

    Cincap

  10. #10
    Membre émérite
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    HC_SKIP pourquoi pas ! Mais dans le cas d'un hook clavier, il faut simplement renvoyer une valeur différente de 0.
    il y a plusieurs façon pour le faire Hook TEven.Onmessage Presskey WndMehtod c'est cincap qui a opté pour le hook

Discussions similaires

  1. [WIN32] Hook clavier / souris
    Par olive_le_malin dans le forum MFC
    Réponses: 6
    Dernier message: 07/06/2006, 15h21
  2. [VB.NET] API hook clavier
    Par Torkan dans le forum Windows Forms
    Réponses: 15
    Dernier message: 05/05/2006, 03h01
  3. hook clavier
    Par bou3 dans le forum Windows
    Réponses: 5
    Dernier message: 14/06/2005, 17h12
  4. Hook Clavier et changement de touche
    Par Fly_57 dans le forum API, COM et SDKs
    Réponses: 6
    Dernier message: 09/08/2004, 19h42
  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