Hook Clavier + Pavé numérique

Hook Clavier + Pavé numérique - C++ - Programmation

Marsh Posté le 27-03-2012 à 12:51:39    

Bonjour,
 
Après achat de ce mini clavier http://www.mobilitylab.eu/mini-des [...] ilver.html de 107 touches,
je voulais un pavé numérique pour le positionner du coté gauche du clavier.
Hors en activant le numlock du pavé numérique cela m'active aussi celui du mini clavier ainsi au lieu d'avoir les lettres uiop j'ai 456-.
J'ai trouvé ce programme la :
http://www.bellamyjc.org/fr/systeme.html#knumlock
 
Mais il ne fonctionne que sur un OS 32bits, et je suis sous Seven 64bits et je me suis donc lancé dans la ré-écriture de ce programme en C++.
Mais je suis confronté au problème suivant :
Je ne comprend pas comme il fait dans son programme pour différencier si les frappes viennes du pavé numérique ou du clavier.
 
Voici sa fonction en delphi :  

Code :
  1. //-----------------Keyboard Hook Callback---------------//
  2. function MsgHook(hCode,wParam:LongInt;lParam:LongInt):Longint;stdcall;
  3. var
  4. p : pMsg;
  5. oldVK,newVK : word;
  6. oldSC,newSC : word;
  7. extendkey : boolean;
  8. modif : boolean;
  9. begin
  10. if (hCode>=0) then
  11.    begin
  12.    p:=pmsg(lparam);
  13.    if (p^.message=wm_KeyDown) or (p^.message=wm_KeyUp) then
  14.       begin
  15.       oldVK:=p^.wparam;
  16.  oldSC:=hiword(p^.lparam) and $00FF;
  17.  extendkey:=((hiword(p^.lparam) and $0100)=$0100);
  18.       if not extendkey then
  19.     begin 
  20. ShowMessage('Hello world from a Delphi DLL');
  21.     modif:=true;
  22.   case oldVK of
  23.       VK_NUMPAD7   : newVK:=VK_NUMPAD7;
  24.        VK_UP     : newVK:=VK_NUMPAD8;
  25.         VK_PRIOR  : newVK:=VK_NUMPAD9;
  26.        VK_LEFT   : newVK:=VK_NUMPAD4;
  27.         VK_CLEAR  : newVK:=VK_NUMPAD5;
  28.        VK_RIGHT  : newVK:=VK_NUMPAD6;
  29.         VK_END  : newVK:=VK_NUMPAD1;
  30.        VK_DOWN  : newVK:=VK_NUMPAD2;
  31.        VK_NEXT  : newVK:=VK_NUMPAD3;
  32.         VK_INSERT : newVK:=VK_NUMPAD0;
  33.        VK_DELETE : newVK:=VK_DECIMAL;
  34.         else modif:=false;
  35.             end;
  36.   if modif then
  37.           begin
  38.             p^.wparam:=newVK;
  39.             newSC:=MapVirtualKey(newVK,0);
  40.             p^.lParam:=p^.lParam and $FF00FFFF or (newSC shl 32  );
  41.             end;
  42.     end;
  43.       end;
  44.    end;
  45. Result:=CallNextHookEx(MyData.hHookMsg,hCode,wParam,lParam);
  46. end;


 
Et voici la mienne en C++ mais encre en debug et mode je comprend pas !
 

Code :
  1. Hookmsg_API LRESULT CALLBACK Hookmsg(int ncode,WPARAM wparam,LPARAM lparam){
  2. //if(ncode>=0) //
  3. if(ncode<0)
  4.  return CallNextHookEx(hook,ncode,wparam,lparam);
  5. MSG *msg;
  6. msg=(MSG *)lparam;
  7. WORD newVK;
  8. WORD newSC;
  9. if(ncode==HC_ACTION)
  10. {
  11.  if((msg->message == WM_KEYUP))//Check whether key was pressed(not released).
  12.  //if (!(lparam & 0x70000000))
  13.  //if (lparam & (1 << 31))
  14.  {
  15.   WORD oldVK=msg->wParam;
  16.   WORD oldSC=HIWORD(msg->wParam) & 0x00FF;
  17.   bool extendkey=false;
  18.   if(((HIWORD(msg->wParam) & 0x0100) == 0x0100))
  19.   {
  20.    extendkey=true;
  21.   }
  22.   if(!extendkey)
  23.   {
  24.    bool modif=true;
  25.    switch(oldVK)//wparam
  26.    {
  27.     /*case VK_INSERT: MessageBox( NULL, TEXT("VK_INSERT" ), TEXT("Error!" ), MB_OK);break;
  28.     case VK_END: MessageBox( NULL, TEXT("VK_END" ), TEXT("Error!" ), MB_OK);break;
  29.     case VK_DOWN: MessageBox( NULL, TEXT("VK_DOWN" ), TEXT("Error!" ), MB_OK);break;
  30.     case VK_NEXT: MessageBox( NULL, TEXT("VK_NEXT" ), TEXT("Error!" ), MB_OK);break;
  31.     case VK_LEFT: MessageBox( NULL, TEXT("VK_LEFT" ), TEXT("Error!" ), MB_OK);break;
  32.     case VK_CLEAR: MessageBox( NULL, TEXT("VK_CLEAR" ), TEXT("Error!" ), MB_OK);break;
  33.     case VK_RIGHT: MessageBox( NULL, TEXT("VK_RIGHT" ), TEXT("Error!" ), MB_OK);break;
  34.     case VK_HOME: MessageBox( NULL, TEXT("VK_HOME" ), TEXT("Error!" ), MB_OK);break;
  35.     case VK_UP: MessageBox( NULL, TEXT("VK_UP" ), TEXT("Error!" ), MB_OK);break;
  36.     case VK_PRIOR: MessageBox( NULL, TEXT("VK_PRIOR" ), TEXT("Error!" ), MB_OK);break;
  37.     case VK_DELETE: MessageBox( NULL, TEXT("VK_DELETE" ), TEXT("Error!" ), MB_OK);break;*/
  38.     case VK_INSERT: newVK=VK_NUMPAD0; break;
  39.     case VK_END: newVK=VK_NUMPAD1; break;
  40.     case VK_DOWN: newVK=VK_NUMPAD2; break;
  41.     case VK_NEXT: newVK=VK_NUMPAD3; break;
  42.     case VK_LEFT: newVK=VK_NUMPAD4; break;
  43.     case VK_CLEAR: newVK=VK_NUMPAD5; break;
  44.     case VK_RIGHT: newVK=VK_NUMPAD6; break;
  45.     case VK_HOME: newVK=VK_NUMPAD7; break;
  46.     case VK_UP: newVK=VK_NUMPAD8; break;
  47.     case VK_PRIOR: newVK=VK_NUMPAD9; break;
  48.     case VK_DELETE: newVK=VK_DECIMAL; break;
  49.     default: modif=false;
  50.    }
  51.    if(modif==true)
  52.    {
  53.     newSC=MapVirtualKey(newVK,MAPVK_VK_TO_VSC);
  54.     msg->lParam &= 0xFF00FFFF;
  55.     msg->lParam += (newSC >> 16 );
  56.     MessageBox( NULL, TEXT("OK" ), TEXT("Error!" ), MB_OK);
  57.    }
  58.   }
  59.  }
  60. }
  61. return ( CallNextHookEx(hook,ncode,wparam,lparam) );//pass control to next hook in the hook chain.
  62. }


 
De plus je n'arrive pas à mapper la frappe qui doit remplacer l’ancienne ainsi que ce bout de code là.
p^.wparam:=newVK;
newSC:=MapVirtualKey(newVK,0);
p^.lParam:=p^.lParam and $FF00FFFF or (newSC shl 16  );
 
Ainsi, je viens rechercher un peu d'aide pour m'aider à finaliser mon programme.
 
Merci d'avance.

Reply

Marsh Posté le 27-03-2012 à 12:51:39   

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed