分享

java 监听 键盘 全局

 77b8 2012-11-14

jna test【鼠标 键盘钩子】

Java代码 
  1. package jna_test;  
  2.   
  3. import com.sun.jna.platform.win32.WinDef.LRESULT;  
  4. import com.sun.jna.platform.win32.WinDef.WPARAM;  
  5. import com.sun.jna.platform.win32.WinUser.HOOKPROC;  
  6.   
  7. interface LowLevelMouseProc extends HOOKPROC {  
  8.     LRESULT callback( int nCode, WPARAM wParam, MOUSEHOOKSTRUCT lParam );  
  9. }  


Java代码  
  1. package jna_test;  
  2.   
  3. import com.sun.jna.Structure;  
  4. import com.sun.jna.platform.win32.BaseTSD.ULONG_PTR;  
  5. import com.sun.jna.platform.win32.WinDef.HWND;  
  6. import com.sun.jna.platform.win32.WinUser.POINT;  
  7.   
  8. public class MOUSEHOOKSTRUCT extends Structure {  
  9.     public class ByReference extends MOUSEHOOKSTRUCT implements  
  10.             Structure.ByReference {  
  11.     };  
  12.       
  13.     public POINT        pt;  
  14.     public HWND         hwnd;  
  15.     public int          wHitTestCode;  
  16.     public ULONG_PTR    dwExtraInfo;  
  17. }  

Java代码 
  1. package jna_test;  
  2.   
  3. import com.sun.jna.platform.win32.Kernel32;  
  4. import com.sun.jna.platform.win32.User32;  
  5. import com.sun.jna.platform.win32.WinDef.HMODULE;  
  6. import com.sun.jna.platform.win32.WinDef.LRESULT;  
  7. import com.sun.jna.platform.win32.WinDef.WPARAM;  
  8. import com.sun.jna.platform.win32.WinUser;  
  9. import com.sun.jna.platform.win32.WinUser.HHOOK;  
  10. import com.sun.jna.platform.win32.WinUser.KBDLLHOOKSTRUCT;  
  11. import com.sun.jna.platform.win32.WinUser.LowLevelKeyboardProc;  
  12. import com.sun.jna.platform.win32.WinUser.MSG;  
  13.   
  14. public class MouseLLHook {  
  15.       
  16.     // 鼠标钩子函数里判断按键类型的常数  
  17.     public static final int     WM_LBUTTONUP    = 514;  
  18.     public static final int     WM_LBUTTONDOWN  = 513;  
  19.     public static final int     WM_RBUTTONUP    = 517;  
  20.     public static final int     WM_RBUTTONDOWN  = 516;  
  21.     public static final int     WM_MOUSEHWHEEL  = 526;  
  22.     public static final int     WM_MOUSEWHEEL   = 522;  
  23.     public static final int     WM_MOUSEMOVE    = 512;  
  24.       
  25.     static HHOOK                mouseHHK, keyboardHHK;  // 鼠标、键盘钩子的句柄  
  26.     static LowLevelMouseProc    mouseHook;              // 鼠标钩子函数  
  27.     static LowLevelKeyboardProc keyboardHook;           // 键盘钩子函数  
  28.                                                           
  29.     // 安装钩子  
  30.     static void setHook() {  
  31.         HMODULE hMod = Kernel32.INSTANCE.GetModuleHandle( null );  
  32.         mouseHHK = User32.INSTANCE.SetWindowsHookEx( WinUser.WH_MOUSE_LL,  
  33.                 mouseHook, hMod, 0 );  
  34.         keyboardHHK = User32.INSTANCE.SetWindowsHookEx( WinUser.WH_KEYBOARD_LL,  
  35.                 keyboardHook, hMod, 0 );  
  36.     }  
  37.       
  38.     // 卸载钩子  
  39.     static void unhook() {  
  40.         User32.INSTANCE.UnhookWindowsHookEx( keyboardHHK );  
  41.         User32.INSTANCE.UnhookWindowsHookEx( mouseHHK );  
  42.     }  
  43.       
  44.     public static void main( String[] args ) {  
  45.           
  46.         keyboardHook = new LowLevelKeyboardProc() {  
  47.               
  48.             @Override  
  49.             // 该函数参数的意思参考:http://msdn.microsoft.com/en-us/library/windows/desktop/ms644985(v=vs.85).aspx  
  50.             public LRESULT callback( int nCode, WPARAM wParam,  
  51.                     KBDLLHOOKSTRUCT lParam ) {  
  52.                 int w = wParam.intValue();  
  53.                 // 按下alt键时w=.WM_SYSKEYDOWN; 按下其他大部分键时w=WinUser.WM_KEYDOWN  
  54.                 if ( w == WinUser.WM_KEYDOWN || w == WinUser.WM_SYSKEYDOWN )  
  55.                     System.out.println( "key down: vkCode = " + displayCode( lParam.vkCode ) );  
  56.                 else  
  57.                     if ( w == WinUser.WM_KEYUP || w == WinUser.WM_SYSKEYUP )  
  58.                         System.out.println( "key up: vkCode = " + displayCode( lParam.vkCode )  );  
  59.                   
  60.                 // 如果按下'q'退出程序,'q'的vkCode是81  
  61.                 if ( lParam.vkCode == 81 ) {  
  62.                     unhook();  
  63.                     System.err.println( "program terminated." );  
  64.                     System.exit( 0 );  
  65.                 }  
  66.                 return User32.INSTANCE.CallNextHookEx( keyboardHHK, nCode,  
  67.                         wParam, lParam.getPointer() );  
  68.             }  
  69.   
  70.             private char displayCode( int vkCode ) {  
  71. /*              if ( vkCode > 'a' && vkCode < 'z') { 
  72.                     return "" + ( char ) vkCode; 
  73.                 } 
  74.                 if ( vkCode > 'A' && vkCode < 'Z') { 
  75.                     return "" + ( char ) vkCode; 
  76.                 }*/  
  77.                 return (char ) vkCode ;  
  78.             }  
  79.         };  
  80.           
  81.         mouseHook = new LowLevelMouseProc() {  
  82.               
  83.             @Override  
  84.             // 该函数参数的意思参考:http://msdn.microsoft.com/en-us/library/windows/desktop/ms644986(v=vs.85).aspx  
  85.             public LRESULT callback( int nCode, WPARAM wParam,  
  86.                     MOUSEHOOKSTRUCT lParam ) {  
  87.                 switch ( wParam.intValue() ) {  
  88.                     case WM_MOUSEMOVE:  
  89.                         System.out.print( "mouse moved:" );  
  90.                         break;  
  91.                     case WM_LBUTTONDOWN:  
  92.                         System.out.print( "mouse left button down:" );  
  93.                         break;  
  94.                     case WM_LBUTTONUP:  
  95.                         System.out.print( "mouse left button up" );  
  96.                         break;  
  97.                     case WM_RBUTTONUP:  
  98.                         System.out.print( "mouse right button up:" );  
  99.                         break;  
  100.                     case WM_RBUTTONDOWN:  
  101.                         System.out.print( "mouse right button down:" );  
  102.                         break;  
  103.                     case WM_MOUSEWHEEL:  
  104.                         System.out.print( "mouse wheel rotated:" );  
  105.                         break;  
  106.                 }  
  107.                 System.out  
  108.                         .println( "(" + lParam.pt.x + "," + lParam.pt.y + ")" );  
  109.                 return User32.INSTANCE.CallNextHookEx( mouseHHK, nCode, wParam,  
  110.                         lParam.getPointer() );  
  111.             }  
  112.         };  
  113.           
  114.         System.out.println( "press 'q' to quit." );  
  115.         setHook();  
  116.           
  117.         int result;  
  118.         MSG msg = new MSG();  
  119.         // 消息循环  
  120.         // 实际上while循环一次都不执行,这些代码的作用我理解是让程序在GetMessage函数这里阻塞,不然程序就结束了。  
  121.         while ( ( result = User32.INSTANCE.GetMessage( msg, null00 ) ) != 0 ) {  
  122.             if ( result == -1 ) {  
  123.                 System.err.println( "error in GetMessage" );  
  124.                 unhook();  
  125.                 break;  
  126.             } else {  
  127.                 User32.INSTANCE.TranslateMessage( msg );  
  128.                 User32.INSTANCE.DispatchMessage( msg );  
  129.             }  
  130.         }  
  131.         unhook();  
  132.     }  
  133.       
  134. }  

所需要的两个jar,jna.jar platform.jar可以在 http://www./Code/Jar/j/jna.htm这里下载。 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多