home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 10 / 10.iso / l / l430 / 1.ddi / CHAP6.ZIP / SETEHOOK.C < prev    next >
Encoding:
C/C++ Source or Header  |  1992-06-11  |  3.0 KB  |  103 lines

  1. /*
  2.     SETEHOOK.C -- Example program for SetEventHook
  3.  
  4.     From Chapter 6 of "Undocumented Windows" (Addison-Wesley 1992)
  5.     by Andrew Schulman, Dave Maxey and Matt Pietrek
  6.  
  7.     Build using: WINIOBC SETEHOOK EVNTHOOK (for Borland C++ v3.00)
  8.                  WINIOMS SETEHOOK EVNTHOOK (for Microsoft C/SDK)
  9.     
  10.     MUST be compiled SMALL model because of model
  11.     dependency in EVNTHOOK.ASM
  12. */
  13.  
  14. #include <windows.h> 
  15. #include "wmhandlr.h" 
  16. #include "winio.h" 
  17.  
  18. /* undocumented function */ 
  19. extern void FAR PASCAL SetEventHook(FARPROC lpfnEventHook);
  20.  
  21. /* the Assembler routine from EVNTHOOK.ASM */
  22. extern void far EventHook(void);
  23.  
  24. char * szEvent[] = { "WM_KEYUP", "WM_KEYDOWN", "WM_MOUSEMOVE",
  25.     "WM_LBUTTONDOWN", "WM_LBUTTONUP", "WM_RBUTTONDOWN",
  26.     "WM_RBUTTONUP", "WM_MBUTTONDOWN", "WM_MBUTTONUP", "WM_???" };
  27.  
  28. int wEvent = -1;
  29. int wKeyInfo = -1;
  30. int iEvent;
  31.  
  32. #include "checkord.c"
  33.  
  34. BOOL DeinstHook(HWND hwnd)
  35.     {
  36.     puts("Deinstalling event hook function...");
  37.     SetEventHook(NULL);
  38.     puts("...successfully deinstalled.");
  39.     return TRUE;
  40.     }
  41.  
  42. int main() 
  43.     {
  44.     // Ord/name check
  45.     if (! CheckOrdName("SetEventHook", "USER", 321))
  46.         return 0;
  47.  
  48.     winio_about("SETEHOOK\nIllustrates SetEventHook"
  49.         "\n\nFrom Chapter 6 of"
  50.         "\n\"Undocumented Windows\" (Addison-Wesley, 1992)"
  51.         "\nby Andrew Schulman, David Maxey and Matt Pietrek"
  52.         );
  53.  
  54.     puts("Installing an event hook function...");
  55.     SetEventHook((FARPROC) EventHook);
  56.     puts("...successfully installed.");
  57.  
  58.     // Make sure that we always unhook...
  59.     winio_onclose(winio_current(), (DESTROY_FUNC) DeinstHook);
  60.     
  61.     for (;;)
  62.         {
  63.         wmhandler_yield();
  64.         if ((wEvent == -1) && (wKeyInfo == -1))
  65.             continue;
  66.         
  67.         switch (wEvent) {
  68.             case WM_KEYUP:          iEvent = 0;     break;
  69.             case WM_KEYDOWN:        iEvent = 1;     break;
  70.             case WM_MOUSEMOVE:      iEvent = 2;     break;
  71.             case WM_LBUTTONDOWN:    iEvent = 3;     break;
  72.             case WM_LBUTTONUP:      iEvent = 4;     break;
  73.             case WM_RBUTTONDOWN:    iEvent = 5;     break;
  74.             case WM_RBUTTONUP:      iEvent = 6;     break;
  75.             case WM_MBUTTONDOWN:    iEvent = 7;     break;
  76.             case WM_MBUTTONUP:      iEvent = 8;     break;
  77.             default:                iEvent = 9;
  78.             }
  79.     
  80.         if (iEvent < 2)
  81.             printf("%s - Scan=0x%02X, VK code=0x%02X\n",
  82.                     szEvent[iEvent],
  83.                     HIBYTE(wKeyInfo), LOBYTE(wKeyInfo));
  84.         else
  85.             puts(szEvent[iEvent]);
  86.     
  87.         if ((wEvent == WM_KEYDOWN) &&
  88.             (LOBYTE(wKeyInfo) == VK_ESCAPE))
  89.             {
  90.             puts("** ESC pressed");
  91.             DeinstHook(NULL);
  92.             winio_onclose(winio_current(), (DESTROY_FUNC) NULL);
  93.             break;
  94.             }
  95.         wEvent = -1;
  96.         wKeyInfo = -1;
  97.         }
  98.     
  99.     puts("\nProgram terminated");
  100.     return 0;
  101.     }
  102.  
  103.