home *** CD-ROM | disk | FTP | other *** search
/ Borland Programmer's Resource / Borland_Programmers_Resource_CD_1995.iso / fonts / cw_src / altdll / keyb.c < prev    next >
C/C++ Source or Header  |  1995-05-18  |  4KB  |  201 lines

  1. #define     no_TRACE_
  2.  
  3. #include    "c:\windev\include\windows.h"
  4. #include    "c:\windev\include\memory.h"
  5. #include    "c:\windev\include\string.h"
  6. #include    "ewtdebug.h"
  7.  
  8. #define     WM_ALARM WM_USER+1
  9.  
  10. //static char bfr [80];
  11.  
  12. static char vktable[]= {
  13.     VK_LBUTTON, VK_RBUTTON, VK_CANCEL, VK_MBUTTON, VK_BACK, VK_TAB,
  14.     VK_CLEAR, VK_RETURN, VK_SHIFT, VK_CONTROL, VK_MENU, VK_PAUSE,
  15.     VK_CAPITAL, VK_ESCAPE, VK_SPACE, VK_PRIOR, VK_NEXT, VK_END, VK_HOME,
  16.     VK_LEFT, VK_UP, VK_RIGHT, VK_DOWN, VK_SELECT, VK_PRINT, VK_EXECUTE,
  17.     VK_SNAPSHOT, VK_INSERT, VK_DELETE, VK_HELP, VK_NUMPAD0, VK_NUMPAD1,
  18.     VK_NUMPAD2, VK_NUMPAD3, VK_NUMPAD4, VK_NUMPAD5, VK_NUMPAD6, VK_NUMPAD7,
  19.     VK_NUMPAD8, VK_NUMPAD9, VK_MULTIPLY, VK_ADD, VK_SEPARATOR, VK_SUBTRACT,
  20.     VK_DECIMAL, VK_DIVIDE, VK_F1, VK_F2, VK_F3, VK_F4, VK_F5, VK_F6, VK_F7,
  21.     VK_F8, VK_F9, VK_F10, VK_F11, VK_F12, VK_F13, VK_F14, VK_F15, VK_F16,
  22.     VK_NUMLOCK,
  23.     0x91 // SCROLL LOCK
  24. };
  25.  
  26. BOOL     bLAT= TRUE;
  27. BOOL     shift= FALSE;
  28. BOOL     altstate= FALSE;
  29. BOOL     ctrlstate= FALSE;
  30. BOOL     keystate;
  31. BOOL    bF3= FALSE;
  32.  
  33. extern HANDLE   hMainWnd;
  34. extern FARPROC  prevHook;
  35. extern int      legal_use;
  36. int             i= 100;
  37.  
  38. extern WORD     CyrTrs(WORD, WORD, WORD);
  39. extern WORD    CyrNewTrs (WORD, WORD, WORD);
  40.  
  41. int    switch_ctrl (WORD, LONG);
  42. int    switch_shift (WORD, LONG);
  43. int    switch_ctsft (WORD, LONG);
  44.  
  45. int    (*_switchfunc [3]) (WORD, LONG) =
  46.     {
  47.     switch_ctrl,
  48.     switch_shift,
  49.     switch_ctsft
  50.     };
  51.  
  52. extern    int nSwitch;
  53.  
  54. int  FAR PASCAL CyrKeyb(nCode, wParam, lParam)
  55.     int            nCode;
  56.     WORD        wParam;
  57.     LONG        lParam;
  58. {
  59.     int retval= (int)DefHookProc(nCode, wParam, lParam, &prevHook);
  60.     if (nCode < 0) return retval;
  61.  
  62.     keystate= (!(HIWORD(lParam) & 0x8000));
  63.  
  64. //    if (wParam != VK_CONTROL)    waictrl= FALSE;
  65.  
  66.     if ((*_switchfunc [nSwitch]) (wParam, lParam))
  67.         {
  68.         bLAT ^= 1;
  69.         PostMessage (hMainWnd, WM_TIMER, bLAT, 0L);
  70.         MessageBeep (0);
  71.         }
  72.  
  73.     switch (wParam) {
  74.         case VK_CONTROL:
  75.             ctrlstate= keystate;
  76.         break;
  77.         case VK_MENU:
  78.             altstate= keystate;
  79.         break;
  80.         case VK_SHIFT:
  81.             shift= keystate;
  82.         break;
  83.         default:
  84.             if (strchr(vktable, (unsigned char)wParam) == NULL &&
  85.                 !bLAT && !altstate && !ctrlstate) {
  86.                 if (!legal_use) {
  87.                     i--;
  88.                     if (!i) {
  89.                         legal_use= TRUE;
  90.                         PostMessage(hMainWnd, WM_ALARM, 0, 0L);
  91.                     }
  92.                 }
  93.                 if (keystate) {
  94.                     PostMessage (GetFocus (), WM_CHAR,
  95.                         CyrNewTrs (LOBYTE (HIWORD (lParam)), shift, GetKeyState (VK_CAPITAL) & 1),
  96.                          lParam);
  97.                     return 1;
  98.                 }
  99.             }
  100.         break;
  101.     }
  102.     return 0;
  103. }
  104.  
  105. int    waictrl= 0;
  106. int    waishift= 0;
  107. unsigned char    savedcode= 0;
  108.  
  109.     //
  110.     // switch on 'Ctrl' key pressed/released
  111.     //
  112. int    switch_ctrl (WORD wParam, LONG lParam)
  113.     {
  114.     if (wParam == VK_CONTROL)
  115.         {
  116.         if (keystate)
  117.             waictrl= TRUE;
  118.         else
  119.             if (waictrl)
  120.                 {
  121.                 waictrl= FALSE;
  122.                 savedcode= 0;
  123.                 return 1;
  124.                 }
  125.         }
  126.     else
  127.         {
  128.         waictrl= FALSE;
  129.         }
  130.     return 0;
  131.     }
  132.  
  133.     //
  134.     // switch on Shift-Shift keys
  135.     //
  136. int    switch_shift (WORD wParam, LONG lParam)
  137.     {
  138.     if (wParam == VK_SHIFT)                // SHIFT-key
  139.         {
  140.         if (keystate)                // pressed
  141.             {
  142.             if (waishift)            // wait for next 'Shift'
  143.                 {
  144.                 if (savedcode != LOBYTE (HIWORD (lParam)))
  145.                     {
  146.                     waishift= FALSE;
  147.                     savedcode= 0;
  148.                     return 1;
  149.                     }
  150.                 else
  151.                     {
  152.                     savedcode= LOBYTE (HIWORD (lParam));
  153.                     return 0;
  154.                     }
  155.                 }
  156.             else
  157.                 waishift= TRUE;
  158.                 savedcode= LOBYTE (HIWORD (lParam));
  159.             }
  160.         else
  161.             {
  162.             waishift= FALSE;
  163.             }
  164.         }
  165.     else
  166.         {
  167.         waishift= FALSE;
  168.         }
  169.     return 0;
  170.     }
  171.  
  172.     //
  173.     // switch on Ctrl-Shift keys
  174.     //
  175. int    switch_ctsft (WORD wParam, LONG lParam)
  176.     {
  177.         if (ctrlstate)
  178.             {
  179.             if (wParam == VK_SHIFT)
  180.                 {
  181.                 if (keystate)
  182.                     {
  183.                     if (savedcode == LOBYTE (HIWORD (lParam)))
  184.                         return 0;
  185.                     savedcode= LOBYTE (HIWORD (lParam));
  186.                     if (LOBYTE (HIWORD (lParam)) == 0x2A)
  187.                         {
  188.                         bLAT= FALSE;
  189.                         }
  190.                     else
  191.                         {
  192.                         bLAT= TRUE;
  193.                         }
  194.                     savedcode= 0;
  195.                     return 1;
  196.                     }
  197.                 }
  198.             }
  199.         return 0;
  200.     }
  201.