home *** CD-ROM | disk | FTP | other *** search
/ HomeWare 14 / HOMEWARE14.bin / os2 / fixkey.arj / SOURCE.ZIP / fixhook.c next >
C/C++ Source or Header  |  1994-04-04  |  3KB  |  119 lines

  1. #include "kbdscan.h"
  2. #define INCL_WIN
  3. #define INCL_DOSMODULEMGR
  4. #define INCL_DOSPROCESS        // for DosGetInfoBlocks
  5. #define INCL_DOSSESMGR         // for SSF_TYPE_* constants
  6. #include <os2.h>
  7.  
  8. BOOL EXPENTRY keyboardHook(HAB hab, PQMSG pqmsg, ULONG fs);  
  9. BOOL installHook(HAB hab);
  10. void uninstallHook(HAB hab);
  11. HMODULE hookModuleHandle;
  12.  
  13. void uninstallHook(HAB hab)
  14. {
  15.     WinReleaseHook(hab, NULLHANDLE, HK_INPUT, (PFN) keyboardHook,
  16.            hookModuleHandle);  
  17. }
  18.  
  19. BOOL installHook(HAB hab)
  20. {
  21.     APIRET rc;
  22.     
  23.     // get DLL module handle 
  24.     rc = DosQueryModuleHandle("FIXHOOK", &hookModuleHandle);
  25.     if (rc != 0) {
  26.     printf("Unable to get fixhook.dll handle: %d\n", rc);
  27.     return(FALSE);
  28.     }
  29.     
  30.     // Install keyboard hook 
  31.     rc = WinSetHook(hab, NULLHANDLE, HK_INPUT, (PFN)keyboardHook,
  32.             hookModuleHandle);
  33.     if (!rc) {
  34.     printf("Unable to hook system input queue: %d\n", rc);
  35.     return(FALSE);
  36.     }
  37.     return(TRUE);
  38. }
  39.  
  40. BOOL EXPENTRY keyboardHook(HAB hab, PQMSG pqmsg, ULONG fs)
  41. {
  42.     PTIB ptib;
  43.     PPIB ppib;
  44.     PUSHORT pfsflags;  // pointer to fsflags portion of WM_CHAR message
  45.     PUSHORT pusvk;     // pointer to usvk portion of WM_CHAR message
  46.     PUCHAR puchCh;     // pointer to usch portion of WM_CHAR message
  47.     
  48.     // we are only interested in keyboard events 
  49.     if ((pqmsg->msg) != WM_CHAR) return FALSE;
  50.  
  51.     // assign pointers to the correct portions of the WM_CHAR message.
  52.     pfsflags = (PUSHORT) &(pqmsg->mp1);
  53.     pusvk = ((PUSHORT) &(pqmsg->mp2)) + 1; // ushort 2 from mp2
  54.     puchCh = (PUCHAR) &(pqmsg->mp2);
  55.  
  56.     // translate only PM messages 
  57.     DosGetInfoBlocks(&ptib, &ppib);
  58.     if ( ppib->pib_ultype != SSF_TYPE_PM ) return FALSE;
  59.  
  60.     // special case: keypad enter and '/' key
  61.     if ( *puchCh == 0x0d ) {
  62.     *pusvk = VK_ENTER;
  63.     *pfsflags |= KC_CHAR;
  64.     } else if (*puchCh == 0x2f) 
  65.     *pfsflags |= KC_CHAR;
  66.  
  67.     // from here, only interested in grey cursor keys and f11/f12 to
  68.     // fixup. 
  69.     if ( *puchCh!=0xe0 && *puchCh )
  70.     return FALSE;
  71.     
  72.     // assign correct virtual key code to message, by first checking the 
  73.     // second byte of the character chr
  74.     switch( *(puchCh+1) ) {
  75.       case K_HOME:
  76.     *pusvk = VK_HOME;
  77.     break;
  78.       case K_UP:
  79.     *pusvk = VK_UP;
  80.     break;
  81.       case K_PAGEUP:
  82.     *pusvk = VK_PAGEUP;
  83.     break;
  84.       case K_LEFT:
  85.     *pusvk = VK_LEFT;
  86.     break;
  87.       case K_RIGHT:
  88.     *pusvk = VK_RIGHT;
  89.     break;
  90.       case K_END:
  91.     *pusvk = VK_END;
  92.     break;
  93.       case K_DOWN:
  94.     *pusvk = VK_DOWN;
  95.     break;
  96.       case K_PAGEDOWN:
  97.     *pusvk = VK_PAGEDOWN;
  98.     break;
  99.       case K_INS:
  100.     *pusvk = VK_INSERT;
  101.     break;
  102.       case K_DEL:
  103.     *pusvk = VK_DELETE;
  104.     break;
  105.       case K_F11:
  106.     *pusvk = VK_F11;
  107.     break;
  108.       case K_F12:
  109.     *pusvk = VK_F12;
  110.     break;
  111.       default:
  112.     return FALSE;
  113.     }
  114.  
  115.     // assign KC_VIRTUALKEY flag to pfsflags part of message
  116.     *pfsflags |= KC_VIRTUALKEY;
  117.     return FALSE;
  118. }
  119.