日期:2014-05-20  浏览次数:20773 次

关于WinUser键盘鼠标钩子
import com.sun.jna.platform.win32.Kernel32;
import com.sun.jna.platform.win32.User32;
import com.sun.jna.platform.win32.WinUser;
import com.sun.jna.platform.win32.WinDef.HMODULE;
import com.sun.jna.platform.win32.WinDef.LRESULT;
import com.sun.jna.platform.win32.WinDef.WPARAM;
import com.sun.jna.platform.win32.WinUser.HHOOK;
import com.sun.jna.platform.win32.WinUser.HOOKPROC;
import com.sun.jna.platform.win32.WinUser.KBDLLHOOKSTRUCT;
import com.sun.jna.platform.win32.WinUser.LowLevelKeyboardProc;
import com.sun.jna.platform.win32.WinUser.MSG;

/**
 * @author Administrator
 */
public class MyHooker extends Thread{


private static HHOOK kHHOOK=null;
private static HHOOK mHHOOK=null;
private static HMODULE hMod = Kernel32.INSTANCE.GetModuleHandle(null); 
private static MSG msg=new MSG();

public void run(){
HOOKPROC kHOOK=new LowLevelKeyboardProc(){
     public LRESULT callback(int nCode, WPARAM wParam, KBDLLHOOKSTRUCT lParam) {  
     MyThread.i=0;
     return User32.INSTANCE.CallNextHookEx(kHHOOK, nCode,wParam,lParam.getPointer());
     }
     }; 
     HOOKPROC mHOOK=new LowLevelKeyboardProc(){
     public LRESULT callback(int nCode, WPARAM wParam, KBDLLHOOKSTRUCT lParam) {  
     MyThread.i=0;
     return User32.INSTANCE.CallNextHookEx(mHHOOK, nCode,wParam,lParam.getPointer());
     }
     }; 
     kHHOOK= User32.INSTANCE.SetWindowsHookEx(WinUser.WH_KEYBOARD_LL,kHOOK,hMod,0);  
mHHOOK= User32.INSTANCE.SetWindowsHookEx(WinUser.WH_MOUSE_LL,mHOOK,hMod,0); 
System.out.println("^^^^^^^^^^^^^^^^");

User32.INSTANCE.GetMessage(msg,null,0,0);

/*while(true){
boolean a=User32.INSTANCE.PeekMessage(msg,null,0,0,1);
System.out.println("PeekMessage:"+a);
}*/
System.out.println("$$$$$$$$$$$$$$$$");
}

public static void unHook(){
System.out.println("unHook start...");
//User32.INSTANCE.DispatchMessage(msg);
User32.INSTANCE.UnhookWindowsHookEx(kHHOOK);  
User32.INSTANCE.UnhookWindowsHookEx(mHHOOK); 
System.out.println("unHook end");

}
}


以上代码  
为什么执行 User32.INSTANCE.GetMessage(msg,null,0,0); 
才有HOOKPROC的callBack调用?
有没有去掉GetMessage就可调用callBack的方法 
主要是因为GetMessage阻塞了线程;
MFC的系统钩子我也看过了 
对这块很不理解 
抛砖引玉 多指教分多多送


------解决方案--------------------
没玩过jna,帮你顶下。