Share Pastebin
Guest
Public paste!

Untitled

By: a guest | Mar 12th, 2010 | Syntax: None | Size: 2.30 KB | Hits: 112 | Expires: Never
Copy text to clipboard
  1. // syshook.cpp
  2. /*
  3.  *      SysHook - 7/17/05
  4.  *      Jacob Gohlke
  5.  *     
  6.  *      JNI Interface for setting a Keyboard Hook and monitoring
  7.  *      it Java-side
  8.  *
  9.  *      (c) Copyright 2005 Jacob Gohlke
  10.  *     
  11.  *      Feel free to use and learn from this code, royalty-free!
  12.  *      I only ask you acknkowlege what library you are using
  13.  *      and who made it. Thanks, and happy hooking!
  14.  */
  15.  
  16. #include <windows.h>
  17. #include <winuser.h>
  18. #include "jni.h"
  19. #include "syshook.h"
  20.  
  21. #pragma data_seg(".HOOKDATA") //Shared data among all instances.
  22. static HHOOK hkb = NULL;
  23. static HANDLE g_hModule = NULL;
  24. static WPARAM g_wParam = NULL;
  25. static LPARAM g_lParam = NULL;
  26.  
  27. JNIEXPORT void NotifyJava(JNIEnv *env, jobject obj, WPARAM wParam, LPARAM lParam)
  28. {              
  29.         jclass cls = env->GetObjectClass(obj);
  30.         jmethodID mid;
  31.  
  32.         mid = env->GetMethodID(cls, "Callback", "(ZIZZ)V");
  33.         if (mid == NULL)
  34.                         return;
  35.  
  36.         if( (HIWORD( lParam ) & KF_UP) )
  37.                 env->CallVoidMethod(obj, mid, (jboolean)FALSE, (jint)(wParam), (jboolean)(HIWORD( lParam ) & KF_ALTDOWN), (jboolean)(HIWORD( lParam ) & KF_EXTENDED));
  38.         else
  39.                 env->CallVoidMethod(obj, mid, (jboolean)TRUE, (jint)(wParam), (jboolean)(HIWORD( lParam ) & KF_ALTDOWN), (jboolean)(HIWORD( lParam ) & KF_EXTENDED));
  40. }
  41.  
  42. #pragma data_seg()
  43.  
  44. #pragma comment(linker, "/SECTION:.HOOKDATA,RWS")
  45.  
  46. JNIEXPORT LRESULT CALLBACK HookKeyboardProc(INT nCode, WPARAM wParam, LPARAM lParam)
  47. {
  48.     if (nCode < 0)  // do not process message
  49.                 return CallNextHookEx(hkb, nCode, wParam, lParam);
  50.  
  51.         g_wParam = wParam;
  52.         g_lParam = lParam;
  53.         return CallNextHookEx(hkb, nCode, wParam, lParam);
  54. }
  55.  
  56. JNIEXPORT void JNICALL Java_PollThread_checkKeyboardChanges(JNIEnv *env, jobject obj)
  57. {
  58.         if(g_wParam != NULL && g_lParam != NULL)
  59.         {
  60.                 NotifyJava(env, obj, g_wParam, g_lParam);
  61.                 g_wParam = NULL;
  62.                 g_lParam = NULL;
  63.         }
  64. }
  65.  
  66. static void Init()
  67. {
  68.         hkb = SetWindowsHookEx( WH_KEYBOARD, (HOOKPROC)HookKeyboardProc, (HINSTANCE)g_hModule, 0 );
  69. }
  70.  
  71. static void Cleanup()
  72. {
  73.         if( hkb != NULL )
  74.                 UnhookWindowsHookEx( hkb );
  75.  
  76.         hkb = NULL;
  77. }
  78.  
  79. BOOL APIENTRY DllMain( HANDLE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved )
  80. {
  81.         switch(ul_reason_for_call)
  82.         {
  83.                 case DLL_PROCESS_ATTACH:
  84.                         g_hModule = hModule;
  85.                         Init();
  86.                         return TRUE;
  87.  
  88.                 case DLL_PROCESS_DETACH:
  89.                         Cleanup();
  90.                         return TRUE;
  91.         }
  92.  
  93.     return TRUE;
  94. }