Hook clavier

mighty_warrior Messages postés 123 Date d'inscription lundi 12 juin 2006 Statut Membre Dernière intervention 9 février 2010 - 14 avril 2007 à 17:13
mighty_warrior Messages postés 123 Date d'inscription lundi 12 juin 2006 Statut Membre Dernière intervention 9 février 2010 - 4 mai 2007 à 20:10
bonjours,

je voulais savoir si le hook clavier fonctionne normalement sur n'importe quelles applications, que ce soit un jeu ou un programme de traitement de texte....etc.

Bref est-ce universel

Je pose cette question car j'ai créer un programme qui émule certaine touches du clavier spécialement pour des jeux vidéo. Ceci me permet d'utiliser un joystick de ma fabrication qui se branche sur le port série. Il fonctionne parfaitement avec un de mes jeux mais pas avec l'autre. POURQUOI

C'est cette ligne de code précisément qui remplit la fonction d'émulation:
keybd_event((strtoint(label11.caption )) ,0,1,0); // le label contient le code touche.

merci

19 réponses

Utilisateur anonyme
15 avril 2007 à 00:50
Salut

Avant de poser une telle question, il aurait mieux valu que tu prennes la peine de te demander comment fonctionne un hook et quel est son principe : voir google entre autre.

En tapant simplement hook clavier sur google, on lit cela :

"BeLZeL.Free.Fr - Home | Langage C | Hook Clavier Global ...
Ce programme intercepte toutes les touches du clavier sur lesquelles vous tapez, quelle que soit l'application (d'où sa globalité). ...
belzel.free.fr/hook/index.html - 4k - En cache - Pages similaires"

Merci de chercher avant de poster
0
mighty_warrior Messages postés 123 Date d'inscription lundi 12 juin 2006 Statut Membre Dernière intervention 9 février 2010
15 avril 2007 à 01:34
j'ai fait une recherche sur google avant de poser la question. c'est ce que je fait systématiquement avant de poser une question.
mais mes recherches ne m'ont pas aider a trouver la solution (s'il y en a une)c'est pourquoi je demande sur ce forum.
0
Utilisateur anonyme
17 avril 2007 à 22:43
[auteurdetail.aspx?ID=798603 mighty_warrior]




Quand tu tapes Hook sous google, tu le vois associer à Keylogger : donc je te laisse soin de trouver la réponse à ta question car elle me semble évidente
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
20 avril 2007 à 18:42
Salut,


Je crois pas que ça marche pour les jeux utilisant DirectInput (C'est à dire la majorité des jeux récents).


Je n'ai jamais fait de hook clavier.


Par contre, j'ai d'éjà essayé spy++, un utilitaire de Visual Studio qui
capture les messages de Windows. Et il était manifeste qu'il avait bien
du mal à récupérer des messages intéressant de la part d'une appli
utilisant DirectInput... Et il serait logique que DirectInput
courcircuite le traitement habituel des messges pour accélérer le
traitement. Donc...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mighty_warrior Messages postés 123 Date d'inscription lundi 12 juin 2006 Statut Membre Dernière intervention 9 février 2010
21 avril 2007 à 10:29
bonjour,

Hé bien à moi l'explication ne me semble pas évidente. Je ne voit pas ce qu'un enregistreur de touche vient faire là dedans! Et pourtant c'est pas faute d'avoir cherché.

Une petite précision de plus serait la bienvenue.

d'avance, merci.
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
23 avril 2007 à 12:12
DirectInput (Encore que ça doit dépendre de son cooperative level) est très proche du matériel et courcircuite tout ce qui est keybd_event, hook...

Donc apparement, tu ne peux pas envoyer de touche à un jeu utilisant DirectInput.

(Sauf méthode supra lourde genre injection de code, ou si c'est toi qui a écrit le jeu bien sûr...)
0
mighty_warrior Messages postés 123 Date d'inscription lundi 12 juin 2006 Statut Membre Dernière intervention 9 février 2010
27 avril 2007 à 19:12
salut RT15, quand je disait: "Hé bien à moi l'explication ne me semble pas évidente. Je ne voit pas
ce qu'un enregistreur de touche vient faire là dedans! Et pourtant
c'est pas faute d'avoir cherché." ça n'était pas destiné a ta reponse sur DirectInput qui est trés clair mais a franky.... ki trouve que la solution a mon probléme est évidente (avis que je suis loin de partagé).
0
Utilisateur anonyme
28 avril 2007 à 15:09
Oupss tu es sur d'avoir cherché ? je ne pense pas.

un keylogger est tout simplement un hook clavier.
tout message windows est intercepté par un hook clavier de ce fait ca marche pour toute les applications.
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
28 avril 2007 à 15:49
On est pas du tout d'accord francki lol.

Je te propose un rendez vous dans une ruelle sombre. Au bazooka, ça te va ?

Pourquoi MS se serait embèté à faire un DirectInput si c'était pour que ça fasse comme le win32 ?

J'ai fait les essais via ce source (tronqué, mais c'est la partie DirectInput):
(Header DX : http://www.clootie.ru/delphi/download_dx92.html)
Faut passer DirectInput un handle de fenêtre plein écran pour que ça bloque (Encore que la mienne se prend un Direct3D en plus dans les dents).

Mais bon, c'est un plutôt très lourd pour un petit éssai, je te l'accorde...

interface


uses
  pasEX_Support,
  Windows, Messages, SysUtils, Forms, Dialogs, IniFiles,
  DXTypes, Direct3D9, D3DX9, DirectInput;


type TInputDevice = (IND_None, IND_KeyBoard, IND_Mouse, IND_Joystick);


type TInputDescription = record
  uDevice: TInputDevice;
  nKey: Integer;
end;


function EXzde_Input_IsActionPressed(const nActionNum: Integer): Tsup_Result; stdcall;
function EXzde_Input_IsActionDown(const nActionNum: Integer): Tsup_Result; stdcall;


function Input_OnResetDevice(const hDC: Integer; const sIniFile: String): Tsup_Result;
function Input_OnMove(const hWindow: Integer): Tsup_Result;
function Input_OnLostDevice(): Tsup_Result;


function GetNextKeyOrButtonDown(const hDC: Integer; var nKeyOrButtonIndex: Integer; var uDevice: TInputDevice): Tsup_Result;


var
  fuDirectInput: IDirectInput;                                // Objet principal
  fuDirectInputKeyBoard: IDirectInputDevice;                  // Device du clavier
  fuDirectInputMouse: IDirectInputDevice;                     // Device de la souris
  fAnKeyboardState: array[0..255] of Byte;                    // L'état du clavier
  fAnKeyPressed: array[1..10] of Integer;                     // Touches appuyées
  fnNumberOfKeyPressed: Cardinal;                             // Nombre de touches appuyées
  fuMouseState: DIMOUSESTATE2;                                // L'etat de la souris
  fAnMouseButtonPressed: array[1..10] of Integer;             // Nombre d'évènements souris
  fnNumberOfMouseButtonPressed: Cardinal;                     // Nombre d'évènements souris
  fAuKeyMap: array of TInputDescription;                      // Les actions et leurs boutons


implementation
//______________________________________________________________________________
// Renvoie vrai si la touche ou le bouton à été appuyé puis relaché.
function EXzde_Input_IsActionPressed(const nActionNum: Integer): Tsup_Result; stdcall;
var
  nI: Integer;
begin
  Result:= SUP_RES_False;
  if fAuKeyMap[nActionNum].uDevice = IND_KeyBoard then
  begin
    for nI:= 1 to fnNumberOfKeyPressed do
      if fAnKeyPressed[nI] = fAuKeyMap[nActionNum].nKey then
      begin
        Result:= SUP_RES_True;
        Exit;
      end;
  end
  else if fAuKeyMap[nActionNum].uDevice = IND_Mouse then
  begin
    if fAuKeyMap[nActionNum].nKey < 8 then
    begin
      for nI:= 1 to fnNumberOfMouseButtonPressed do
        if fAnMouseButtonPressed[nI] = fAuKeyMap[nActionNum].nKey then
        begin
          Result:= SUP_RES_True;
          Exit;
        end;
    end
    else
    begin
      if       (fAuKeyMap[nActionNum].nKey = 8) and (fuMouseState.lZ > 0) then Result:= SUP_RES_True
      else if  (fAuKeyMap[nActionNum].nKey = 9) and (fuMouseState.lZ < 0) then Result:= SUP_RES_True;
    end;
  end
  else
  begin


////////////////////////////////////////////////////////////////////////////////
// TODO: Joystick
////////////////////////////////////////////////////////////////////////////////


  end;
end;
//______________________________________________________________________________
// Renvoie vrai si la touche ou le bouton est actuellement appuyé.
function EXzde_Input_IsActionDown(const nActionNum: Integer): Tsup_Result; stdcall;
begin
  Result:= SUP_RES_False;
  if fAuKeyMap[nActionNum].uDevice = IND_KeyBoard then
  begin
    if (fAnKeyboardState[fAuKeyMap[nActionNum].nKey] and $80) <> 0 then
      Result:= SUP_RES_True;
  end
  else if fAuKeyMap[nActionNum].uDevice = IND_Mouse then
  begin
    if (fAuKeyMap[nActionNum].nKey < 8) and ((fuMouseState.rgbButtons[fAuKeyMap[nActionNum].nKey] and $80) <> 0) then
      Result:= SUP_RES_True;
  end
  else
  begin


////////////////////////////////////////////////////////////////////////////////
// TODO: Joystick
////////////////////////////////////////////////////////////////////////////////


  end;
end;
//______________________________________________________________________________
// Initialisation de DirectInput.
function Input_OnResetDevice(const hDC: Integer; const sIniFile: String): Tsup_Result;
var
  uDeviceDWORDProperty: DIPROPDWORD;         // Pour modifier les options
  uIni: TIniFile;                            // Chargement de la config
  nDevice: Integer;                          // Device de l'action
  nI: integer;
begin


  // Création de l'objet principal
  DirectInput8Create(GetModuleHandle('EX_ZZ3DEngine.dll'), DIRECTINPUT_VERSION, IID_IDirectInput8, fuDirectInput, nil);


  // Préparation de l'enregistrement qui vat permettre de modifier la taille des buffers
  with uDeviceDWORDProperty do
  begin
    dwData:= 10;
    diph.dwSize:= SizeOf(DIPROPDWORD);
    diph.dwHeaderSize:= SizeOf(DIPROPHEADER);
    diph.dwObj:= 0;
    diph.dwHow:= DIPH_DEVICE;
  end;


  // Device du clavier
  fuDirectInput.CreateDevice(GUID_SysKeyboard, fuDirectInputKeyBoard, nil);
  fuDirectInputKeyBoard.SetDataFormat(c_dfDIKeyboard);
  fuDirectInputKeyBoard.SetCooperativeLevel(hDC, DISCL_FOREGROUND or DISCL_EXCLUSIVE);
  fuDirectInputKeyBoard.SetProperty(DIPROP_BUFFERSIZE, uDeviceDWORDProperty.diph);
  fuDirectInputKeyBoard.Acquire;


  // Device de la souris
  fuDirectInput.CreateDevice(GUID_SysMouse, fuDirectInputMouse, nil);
  fuDirectInputMouse.SetDataFormat(c_dfDIMouse2);
  fuDirectInputMouse.SetCooperativeLevel(hDC, DISCL_FOREGROUND or DISCL_EXCLUSIVE);
  fuDirectInputMouse.SetProperty(DIPROP_BUFFERSIZE, uDeviceDWORDProperty.diph);
  fuDirectInputMouse.Acquire;


////////////////////////////////////////////////////////////////////////////////
// TODO: Création du device du joystick
////////////////////////////////////////////////////////////////////////////////


  // Initialisation des infos sur les états
  ZeroMemory(@fAnKeyboardState, SizeOf(fAnKeyboardState));
  fnNumberOfKeyPressed:= 0;
  ZeroMemory(@fuMouseState, SizeOf(fuMouseState));
  fnNumberOfMouseButtonPressed:= 0;


////////////////////////////////////////////////////////////////////////////////
// TODO: Initialisation de l'état du jostick
////////////////////////////////////////////////////////////////////////////////


  // Chargement des touches associées aux évènements
  SetLength(fAuKeyMap, 0);
  nI:= 0;
  uIni:= TIniFile.Create(sIniFile);
  try
 
    // Tant que l'on trouve des actions
    while uIni.ReadString('Actions', IntToStr(nI), '') <> '' do
    begin
      SetLength(fAuKeyMap, Length(fAuKeyMap) + 1);
     
      // Récupération du device
      nDevice:= uIni.ReadInteger('DeviceOfAction', IntToStr(nI), 0);
      if (nDevice < 1) or (nDevice > 3) then
      begin
        fAuKeyMap[nI].uDevice:= IND_None;
        fAuKeyMap[nI].nKey:= 0;
      end
      else
      begin


        // Le device étant OK, on passe à la vérification des touches
        fAuKeyMap[nI].uDevice:= TInputDevice(nDevice);
        fAuKeyMap[nI].nKey:= uIni.ReadInteger('KeyOfAction', IntToStr(nI), -1);
        if (fAuKeyMap[nI].nKey < 0) or
          ((fAuKeyMap[nI].uDevice = IND_KeyBoard)  and (fAuKeyMap[nI].nKey > 255)) or
          ((fAuKeyMap[nI].uDevice = IND_Mouse)     and (fAuKeyMap[nI].nKey > 9)) or
          ((fAuKeyMap[nI].uDevice = IND_Joystick)  and (fAuKeyMap[nI].nKey > 127)) then
        begin
          fAuKeyMap[nI].uDevice:= IND_None;
          fAuKeyMap[nI].nKey:= 0;
        end
      end;


      // Passage à l'action suivante
      Inc(nI);
    end;
  finally
    uIni.Free;
  end;
  Result:= SUP_RES_Ok;
end;
//______________________________________________________________________________
// Destruction de DirectInput.
function Input_OnLostDevice(): Tsup_Result;
begin


////////////////////////////////////////////////////////////////////////////////
// TODO: Libération du device du joystick
////////////////////////////////////////////////////////////////////////////////


  if Assigned(fuDirectInputMouse) then
    fuDirectInputMouse.Unacquire;
  fuDirectInputMouse:= nil;
  if Assigned(fuDirectInputKeyBoard) then
    fuDirectInputKeyBoard.Unacquire;
  fuDirectInputKeyBoard:= nil;
  fuDirectInput:= nil;
  Result:= SUP_RES_Ok;
end;
//______________________________________________________________________________
// Récupération des évènements utilisateur.
function Input_OnMove(const hWindow: Integer): Tsup_Result;
var
  uEventBuffer: array[1..10] of DIDEVICEOBJECTDATA;       // Récupération des évènements
  nI: Integer;
begin


  // Vérification que l'on est sur la bonne fenêtre
  if GetForegroundWindow <> hWindow then
  begin
    fuDirectInputMouse.Unacquire;
    fuDirectInputKeyBoard.Unacquire;
    Result:= SUP_RES_Ok;
    Exit;
  end;


  // Récupération de l'état de la souris
  if fuDirectInputMouse.GetDeviceState(SizeOf(fuMouseState), @fuMouseState) = DIERR_INPUTLOST then
  begin
    ZeroMemory(@fuMouseState, SizeOf(fuMouseState));
    fuDirectInputMouse.Acquire;
  end;


  // Récupération d'un éventuel évènement souris
  fnNumberOfMouseButtonPressed:= 10;
  if fuDirectInputMouse.GetDeviceData(SizeOf(DIDEVICEOBJECTDATA), @uEventBuffer, fnNumberOfMouseButtonPressed, 0) = DIERR_INPUTLOST then
  begin
    fnNumberOfMouseButtonPressed:= 0;
    fuDirectInputMouse.Acquire;
  end
  else
  begin
    for nI:= 1 to fnNumberOfMouseButtonPressed do
    begin
      fAnMouseButtonPressed[nI]:= -1;
      if uEventBuffer[nI].dwOfs >= DIMOFS_BUTTON0 then
        if (uEventBuffer[nI].dwData and $80) = 0 then
          fAnMouseButtonPressed[nI]:= uEventBuffer[nI].dwOfs - DIMOFS_BUTTON0;
    end;
  end;


  // Récupération de l'état du clavier
  if fuDirectInputKeyBoard.GetDeviceState(SizeOf(fAnKeyboardState), @fAnKeyboardState) = DIERR_INPUTLOST then
  begin
    ZeroMemory(@fAnKeyboardState, SizeOf(fAnKeyboardState));
    fuDirectInputKeyBoard.Acquire;
  end;


  // Récupération d'un éventuel évènement clavier
  fnNumberOfKeyPressed:= 10;
  if fuDirectInputKeyBoard.GetDeviceData(SizeOf(DIDEVICEOBJECTDATA), @uEventBuffer, fnNumberOfKeyPressed, 0) = DIERR_INPUTLOST then
  begin
    fnNumberOfKeyPressed:= 0;
    fuDirectInputKeyBoard.Acquire;
  end
  else
  begin
    for nI:= 1 to fnNumberOfKeyPressed do
      if (uEventBuffer[nI].dwData and $80) = 0 then
        fAnKeyPressed[nI]:= uEventBuffer[nI].dwOfs
      else
        fAnKeyPressed[nI]:= -1;
  end;


////////////////////////////////////////////////////////////////////////////////
// TODO: Mise à jour de l'état du joystick
////////////////////////////////////////////////////////////////////////////////


  Result:= SUP_RES_Ok;
end;
//______________________________________________________________________________
// Récupère le numéro et le device de la touche que l'utilisateur va appuyer.
function GetNextKeyOrButtonDown(const hDC: Integer; var nKeyOrButtonIndex: Integer; var uDevice: TInputDevice): Tsup_Result;
var
  uTempDirectInput: IDirectInput;                            // Objet principal
  uTempDirectInputKeyBoard: IDirectInputDevice;              // Device du clavier
  uTempDirectInputMouse: IDirectInputDevice;                 // Device de la souris
  AnTempKeyboardState: array[0..255] of Byte;                // L'état du clavier
  uTempMouseState: DIMOUSESTATE2;                            // L'etat de la souris
  bContinue: WordBool;                                       // Encore aucune touche d'appuyée
  nI: Integer;
begin


  // Création de l'objet principal
  DirectInput8Create(GetModuleHandle('EX_ZZ3DEngine.dll'), DIRECTINPUT_VERSION, IID_IDirectInput8, uTempDirectInput, nil);


  // Création du device du clavier
  uTempDirectInput.CreateDevice(GUID_SysKeyboard, uTempDirectInputKeyBoard, nil);
  uTempDirectInputKeyBoard.SetDataFormat(c_dfDIKeyboard);
  uTempDirectInputKeyBoard.SetCooperativeLevel(hDC, DISCL_FOREGROUND or DISCL_EXCLUSIVE);
  uTempDirectInputKeyBoard.Acquire;


  // Création du device de la souris
  uTempDirectInput.CreateDevice(GUID_SysMouse, uTempDirectInputMouse, nil);
  uTempDirectInputMouse.SetDataFormat(c_dfDIMouse2);
  uTempDirectInputMouse.SetCooperativeLevel(hDC, DISCL_FOREGROUND or DISCL_EXCLUSIVE);
  uTempDirectInputMouse.Acquire;


////////////////////////////////////////////////////////////////////////////////
// TODO: Création du device du joystick
////////////////////////////////////////////////////////////////////////////////


  // Initialisation des états des devices
  ZeroMemory(@uTempMouseState, SizeOf(uTempMouseState));
  ZeroMemory(@AnTempKeyboardState, SizeOf(AnTempKeyboardState));


////////////////////////////////////////////////////////////////////////////////
// TODO: Initialisation de l'état du joystick
////////////////////////////////////////////////////////////////////////////////


  // Attente de la pression d'une touche
  bContinue:= True;
  while bContinue do
  begin
    // Récupération de l'état de la souris
    if uTempDirectInputMouse.GetDeviceState(SizeOf(uTempMouseState), @uTempMouseState) = DIERR_INPUTLOST then
    begin
      ZeroMemory(@uTempMouseState, SizeOf(uTempMouseState));
      fuDirectInputMouse.Acquire;
    end;
    for nI:= 0 to 7 do
      if (uTempMouseState.rgbButtons[nI] and $80) <> 0 then
      begin
        nKeyOrButtonIndex:= nI;
        uDevice:= IND_Mouse;
        bContinue:= False;
        Break;
      end;
    if uTempMouseState.lZ > 0 then
    begin
        nKeyOrButtonIndex:= 8;
        uDevice:= IND_Mouse;
        bContinue:= False;
    end
    else if uTempMouseState.lZ < 0 then
    begin
        nKeyOrButtonIndex:= 9;
        uDevice:= IND_Mouse;
        bContinue:= False;
    end;
    // Récupération de l'état du clavier
    if uTempDirectInputKeyBoard.GetDeviceState(SizeOf(AnTempKeyboardState), @AnTempKeyboardState) = DIERR_INPUTLOST then
    begin
      ZeroMemory(@AnTempKeyboardState, SizeOf(AnTempKeyboardState));
      fuDirectInputKeyBoard.Acquire;
    end;
    for nI:= 0 to 255 do
      if (AnTempKeyboardState[nI] and $80) <> 0 then
      begin
        nKeyOrButtonIndex:= nI;
        uDevice:= IND_KeyBoard;
        bContinue:= False;
        Break;
      end;


////////////////////////////////////////////////////////////////////////////////
// TODO: Récupération de l'état du joystick
////////////////////////////////////////////////////////////////////////////////


  end;
  // Libération de l'objet principal et des devices


////////////////////////////////////////////////////////////////////////////////
// TODO: Libération du device du joystick
////////////////////////////////////////////////////////////////////////////////


  uTempDirectInputMouse.Unacquire;
  uTempDirectInputMouse:= nil;
  uTempDirectInputKeyBoard.Unacquire;
  uTempDirectInputKeyBoard:= nil;
  uTempDirectInput:= nil;
  Result:= SUP_RES_Ok;
end;
//______________________________________________________________________________
end.
0
Utilisateur anonyme
28 avril 2007 à 23:52
"On est pas du tout d'accord francki lol." : tu veux une fessée  ?

Rt15 je te crois sur parole : cependant la question de ce Monsieur était est ce qu'un hook fonctionne pour toutes les applications et :"je voulais savoir si le hook clavier fonctionne normalement sur n'importe quelles applications, que ce soit un jeu ou un programme de traitement de texte....etc."

Hormis ce cas exceptionnel la réponse est oui.

Si je t'ai dis de chercher c'est qu'un Hook clavier intercepte les messages. Avec une simple recherche sur la notion de messages il aurait compris que la notion de message est indépendante de la notion de type d'applications. Et j'irai meme jusqu'à dire que c'est marqué dans tout les liens traitant de ce sujet : c''est meme l'une des premieres choses qui est écritent sur le sujet. Dans tout les cas, un semblant de recherche sur la notion de messages aurait répondu immédiatement à sa question.

Maintenant dans ce cas de figure que je connaissais pas il y a un binze mais je pense pas que c'était sa  question

@+
0
mighty_warrior Messages postés 123 Date d'inscription lundi 12 juin 2006 Statut Membre Dernière intervention 9 février 2010
29 avril 2007 à 13:24
Franky.... pour la Niéme fois: oui G cherché et si les hook claviers fonctonnaient pour toutes les application cette discution n'aurait jamais eu lieu d'être.

RT15 je te remercie grandement pour ton aide c'est super sympas. Ton code...enfin ta partie de code est énorme mais c'est pas grave lol je vais me pencher dessus dés que j'aurai un peut de temps pour le faire. Je tiendrai au courant de l'état d'avancement, ça pourra peut étre servir à quelqu'un d'autre on ne sait jamais.

encore merci a+
0
mighty_warrior Messages postés 123 Date d'inscription lundi 12 juin 2006 Statut Membre Dernière intervention 9 février 2010
29 avril 2007 à 13:27
en tout cas avec tout les jeux récent le hook ne marche pas. il n'y a donc pas de "cas exceptionnel"
0
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
29 avril 2007 à 15:16
Ah la la,
Au lieu de vous criez dessus, commencez par être précis dans votre façon de vous exprimer.

Savez-vous ce qu'est un hook ? Je n'en ai pas l'impression ...
Un hook est une façon pour un module d'intercepter les messages Windows autrement qu'avec la méthode *traditionnelle*.

Pour info, la méthode traditionnelle, c'est avec WaitMessage(), GetMessage() et PeekMessage(), voir le code de Forms.TApplication.Run() pour mieux comprendre.

Un hook permet d'intercepter les messages. C'est un peu différent car les messages interceptés par les hooks parviennent quand même aux destinataires si rien n'est fait pour les arrêter. Un hook peut être global, c'est à dire intercepter TOUS les messages du système ou de se limiter à un certain Handle. Il se met en place à l'aide de SetWindowsHookEx()

Bon, je n'ai vu aucune référence à toutes les fonctions que je viens de citer, comment alors pouvez-vous parler de hooks ?

Keybd_Event() est une procédure d'EMULATION. Il ne s'agit pas ici d'intercepter quelque message que ce soit mais tout l'inverse. Cette procédure permet de simuler un appui ou relâchement de touche sur le clavier.

Je ne connais rien sur DirectInput, n'ayant jamais programmé de jeu. Mais apparament, cette API outrepasse les méthodes classiques de récupération d'état pour avoir une fréquence de traitement plus rapide (ex: la souris ne transmet pas assez d'infos par messages pour suffire à un jeu 3d).

Par contre, ce que je peux dire, c'est que pour simuler un appui de touche sur le clavier, il faut faire DEUX appels à Keybd_Event() (voir http://msdn2.microsoft.com/en-us/library/ms646304.aspx).

Donc, pour simuler un 'A', il faut logiquement faire :
Keybd_event(Ord('A'), 0, 0, 0);
Keybd_event(Ord('A'), 0, KEYEVENTF_KEYUP, 0);

Voila, alors arrêtez un peu de vous chamailler.
0
mighty_warrior Messages postés 123 Date d'inscription lundi 12 juin 2006 Statut Membre Dernière intervention 9 février 2010
29 avril 2007 à 16:29
oui cet avec ces deux appels que mon programme fonctionne!
0
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
29 avril 2007 à 18:25
Super, alors tu n'as plus qu'a valider la réponse qui te convient !
Bonne prog'
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
2 mai 2007 à 09:36
florenth -> Fonctionne "des fois" je pense. Pour le hook, c'est vrai que l'on se demande un peu ce qu'il vient faire dans le titre. Mais il semblerait que les hooks ne fonctionnent pas dans les mêmes cas ou Keybd_event ne fonctionnne pas.

mighty_warrior -> Ce n'est malheurement pas avec mon source que tu pourras envoyer des pressions de touches à une application thiers utilisant DirectInput...

La seul solution qui me paraît avoir une chance de marcher mais qui est très compliquée, ce serait de faire un hook (mais d'API cette fois) des méthodes GetDeviceData et GetDeviceState du clavier. Globalement, il s'agit de remplacer ces méthode par les tiennes dans le jeu à l'execution.

L'algo est simple, la réalisation est nettement plus complexe :

1 Appel de l'exe à GetDeviceData.
2 Ca passe par ta méthode qui appel le vrai GetDeviceData de DirectInput.
3 DirectInput récupère les "vrais" entrées clavier, puis redonne l'execution à ta méthode.
4 Ta méthode modifie les données renvoyée par DirectInput et les remonte au jeu.
5 Le jeu récupère les entrées comme si elle venait effectivement toutes de DirectInput.

Un bouquin qui détail différentes technique d'injection de code. C'est en C, mais c'est très adaptable en Delphi.
Attention : dans le cas de DirectInput, la convention d'appel des fonctions, c'est certainement du safecall.
0
Utilisateur anonyme
2 mai 2007 à 10:23
@Florenth : Un hook est une façon pour un module d'intercepter les messages Windows autrement qu'avec la méthode *traditionnelle*. C'est un peu différent car les messages interceptés par les hooks parviennent quand même aux destinataires si rien n'est fait pour les arrêter. Un hook peut être global, c'est à dire intercepter TOUS les messages du système ou de se limiter à un certain Handle.

Donc on en revient bien à ce que je disais :

1)Principe d'un keylogger
2)Que tout les messages systèmes sont interceptés
3)Que l'auteur n'a pas cherché pour la simple raison raison qu'effectivement il confond hook et simulation de clavier.

Si un hook ne pouvait pas intercépter tout les messages systemes, on ne pourrait pas faire de keylogger : ce n'est pas à défaut de le mettre sur la voix.

Voila une question mal posée et une récherche de mauvaise qualité qui ont induit une question en totale décalage avec la problématique et un dialogue de sourd suite à l'incapacité du posteur de se remettre en question suite aux différentes remarques qui ont été faites.


Seul intéret de RT15 est la remarque qu'il a fait sur DirectInput :  mais je pense pas que l'auteur du message avait pris connaissance de ce fait. Heureusement que certaines personnes ont l'esprit visionnaire
0
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
2 mai 2007 à 13:15
C'est vrai que celui qui pose mal sa question reçoit forcément des réponses à côté de la plaque. Mais qu'il ne vienne pas s'en plaindre non plus ! Il n'avait qu'a parler français comme tout le monde !

@Francky: ce qu'il faut savoir, c'est qu'il y a toujours au moins deux méthodes pour récupérer qqch dans Windows:
- Utiliser les API de haut niveau (les messages en font partie)
- Chercher directement du côté du matériel.

Et à mon, avis, vu comme je connais M$, ça m'étonnerait pas que ce soit le 2ème méthode qui soit utilisée, ce qui veut dire que DirectInput serait capable de récupérer l'état des touches sans utiliser les messages...
Et si c'est le cas, ça va être problématique: il faudrait injecter du code dans DirectX pour faire croire qu'il y a eu une interruption du CPU ... bonne chance quoi ...

"Heureusement que certaines personnes ont l'esprit visionnaire"
=> Mme Irma est mon idole !!! lol

Au fait, et si on laissait ce *warrior* répondre un peu: après tout c'est SON problème, à lui de le préciser, non ?
0
mighty_warrior Messages postés 123 Date d'inscription lundi 12 juin 2006 Statut Membre Dernière intervention 9 février 2010
4 mai 2007 à 20:10
  Je ne pose pas de questions dans le but de "me faire tailler un short"!

Voici quelques phrases qui vont faire plaisir a franky machin chose:
oui tu as raison!
Non , je n'ai rien chercher sur google, www.developpez.com ou sur delphifr avant de poster ce message.
Je ne sait pas titrer mes messages en rapport avec le contenu.
Je suis un abrutis doublé d'un incompétant.
je n'ai pas l'esprit visionaire (dire le contraire serait prétentieux).

Ce que j'ai compris:
 Ce message n'aboutira jamais a rien de concret
 Inutile que je repose une question sur le théme du....enfin de l'émulation de clavier avant quelques années

Comme il me reste une qualité qui est la politesse je vous dit tout de même:

 merci
0
Rejoignez-nous