編碼如下:
package mouse;
import java.awt.AWTException;
import java.awt.MouseInfo;
import java.awt.Robot;
import java.util.Date;
import com.sun.jna.platform.win32.Kernel32;
import com.sun.jna.platform.win32.User32;
import com.sun.jna.platform.win32.WinDef;
import com.sun.jna.platform.win32.WinUser;
public class MouseCatch implements Runnable {
/**
* 獲取滑鼠狀態間隔時間
*/
public static final int MOUSE_TIME_GET_STAT_DELAY = 1000;
/**
* 滑鼠移動
*/
protected static final int _MOUSE_MOVED = 512;
/**
* 左鍵按下
*/
protected static final int _MOUSE_LEFT_PRESSED = 513;
/**
* 左鍵彈起
*/
protected static final int _MOUSE_LEFT_POPS_UP = 514;
/**
* 右鍵按下
*/
protected static final int _MOUSE_RIGHT_PRESSED = 516;
/**
* 右鍵彈起
*/
protected static final int _MOUSE_RIGHT_POPS_UP = 517;
/**
* 中鍵按下
*/
protected static final int _MOUSE_MIDDLE_PRESSED = 519;
/**
* 中鍵彈起
*/
protected static final int _MOUSE_MIDDLE_POPS_UP = 520;
/**
* 中鍵滾動
*/
protected static final int _MOUSE_MIDDLE_ROTATED = 522;
public static void main(String[] args) throws AWTException, InterruptedException {
System.out.println("正在監控中。。。。");
MouseCatch hook = new MouseCatch();
new Thread(hook).start();
// hook.setHookOn();
// Thread.sleep(MOUSE_TIME_GET_STAT_DELAY);
hook.setHookOff();
}
public void outstr(String str) {
System.out.println(str);
}
private boolean mouseMoved = false;
private boolean mouseLeftPressed = false;
private boolean mouseRightPressed = false;
private boolean mouseMiddlePressed = false;
private boolean mouseMiddleRotated = false;
final User32 lib=User32.INSTANCE;
static volatile Date last = new Date();
// 就是一個Windows的句柄,本例中指定的是滑鼠的型別User32.WH_MOUSE_LL
private WinUser.HHOOK hhk;
private WinUser.LowLevelKeyboardProc mouseProc = new WinUser.LowLevelKeyboardProc() {
@Override
public WinDef.LRESULT callback(int nCode, WinDef.WPARAM wParam, WinUser.KBDLLHOOKSTRUCT event) {
if (nCode >= 0) {
// MouseCatch.last = new Date();
setMouseMiddleRotated(false);
setMouseMoved(false);
switch (wParam.intValue()) {
case _MOUSE_MOVED:
// System.out.println("滑鼠移動");
// System.out.println("滑鼠移動"+event.dwExtraInfo.toPointer().);
setMouseMoved(true);
break;
case _MOUSE_LEFT_PRESSED:
// System.out.println("滑鼠左鍵按下");
setMouseleftPressed(true);
break;
case _MOUSE_LEFT_POPS_UP:
// System.out.println("滑鼠左鍵彈起");
setMouseleftPressed(false);
break;
case _MOUSE_RIGHT_PRESSED:
// System.out.println("滑鼠右鍵按下");
setMouseRightPressed(true);
break;
case _MOUSE_RIGHT_POPS_UP:
// System.out.println("滑鼠右鍵彈起");
setMouseRightPressed(false);
break;
case _MOUSE_MIDDLE_PRESSED:
// System.out.println("滑鼠中鍵按下");
setMouseMiddlePressed(true);
break;
case _MOUSE_MIDDLE_POPS_UP:
// System.out.println("滑鼠中鍵彈起");
setMouseMiddlePressed(false);
break;
case _MOUSE_MIDDLE_ROTATED:
// System.out.println("滑鼠中鍵滾動");
setMouseMiddleRotated(true);
break;
default:
setMouseMiddleRotated(false);
setMouseMoved(false);
System.out.println(wParam.intValue());
}
// outstr(String.valueOf("------------------------------------------------"));
// outstr(String.valueOf(isMouseMoved()));
// outstr(String.valueOf(isMouseLeftPressed()));
// outstr(String.valueOf(isMouseRightPressed()));
// outstr(String.valueOf(isMouseMiddlePressed()));
// outstr(String.valueOf(isMouseMiddleRotated()));
}
return lib.CallNextHookEx(hhk, nCode, wParam, null);
}
};
@Override
public void run() {
System.out.println("setHookOn th");
setHookOn();
System.err.println("setHookOn tth");
while (true) {
System.err.println("setHookOn th");
try {
Thread.sleep(MOUSE_TIME_GET_STAT_DELAY);
} catch (InterruptedException e) {
// TODO 自動生成的 catch 塊
e.printStackTrace();
}
if (System.currentTimeMillis() - MouseCatch.last.getTime() >= 10000) {
MouseCatch.last = new Date();
}
setHookOff();
}
}
public void setHookOn() {
// 獲取指定模塊的句柄
WinDef.HMODULE hMod = Kernel32.INSTANCE.GetModuleHandle(null);
// 安裝鉤子,回傳鉤子的句柄
// hhk = User32.INSTANCE.SetWindowsHookEx(User32.WH_MOUSE_LL, mouseProc, hMod, 0);
hhk = lib.SetWindowsHookEx(User32.WH_MOUSE_LL, mouseProc, hMod, 0);
int result;
WinUser.MSG msg = new WinUser.MSG();
// 此函式從呼叫執行緒的訊息佇列中檢索訊息,并將其放入指定的結構中
// User32.INSTANCE.GetMessage(msg, null, 0, 0);
lib.GetMessage(msg, null, 0, 0);
// while ((result = User32.INSTANCE.GetMessage(msg, null, 0, 0)) != 0) {
// if (result == -1) {
// setHookOff();
// break;
// } else {
// User32.INSTANCE.TranslateMessage(msg);
// System.out.println(msg);
// User32.INSTANCE.DispatchMessage(msg);
// System.out.println(msg);
// }
// }
}
// 關閉鉤子
public void setHookOff() {
// User32.INSTANCE.UnhookWindowsHookEx(hhk);
lib.UnhookWindowsHookEx(hhk);
System.out.println("User32.INSTANCE.UnhookWindowsHookEx(hhk);");
// 這一句不行,會關閉應用程式
// System.exit(0);
}
public boolean isMouseLeftPressed() {
return mouseLeftPressed;
}
public void setMouseleftPressed(boolean mousePressed) {
this.mouseLeftPressed = mousePressed;
}
public boolean isMouseMoved() {
return mouseMoved;
}
public void setMouseMoved(boolean mouseMoved) {
this.mouseMoved = mouseMoved;
}
public boolean isMouseRightPressed() {
return mouseRightPressed;
}
public void setMouseRightPressed(boolean mouseRightPressed) {
this.mouseRightPressed = mouseRightPressed;
}
public boolean isMouseMiddlePressed() {
return mouseMiddlePressed;
}
public void setMouseMiddlePressed(boolean mouseMiddlePressed) {
this.mouseMiddlePressed = mouseMiddlePressed;
}
public boolean isMouseMiddleRotated() {
return mouseMiddleRotated;
}
public void setMouseMiddleRotated(boolean mouseMiddleRotated) {
this.mouseMiddleRotated = mouseMiddleRotated;
}
private class MouseStat {
private boolean mouseMoved;
private boolean mouseLeftPressed;
private boolean mouseRightPressed;
private boolean mouseMiddlePressed;
private boolean mouseMiddleRotated;
/**
* @return mouseMoved
*/
public boolean isMouseMoved() {
return mouseMoved;
}
/**
* @param mouseMoved 要設定的 mouseMoved
*/
public void setMouseMoved(boolean mouseMoved) {
this.mouseMoved = mouseMoved;
}
/**
* @return mouseLeftPressed
*/
public boolean isMouseLeftPressed() {
return mouseLeftPressed;
}
/**
* @param mouseLeftPressed 要設定的 mouseLeftPressed
*/
public void setMouseLeftPressed(boolean mouseLeftPressed) {
this.mouseLeftPressed = mouseLeftPressed;
}
/**
* @return mouseRightPressed
*/
public boolean isMouseRightPressed() {
return mouseRightPressed;
}
/**
* @param mouseRightPressed 要設定的 mouseRightPressed
*/
public void setMouseRightPressed(boolean mouseRightPressed) {
this.mouseRightPressed = mouseRightPressed;
}
/**
* @return mouseMiddlePressed
*/
public boolean isMouseMiddlePressed() {
return mouseMiddlePressed;
}
/**
* @param mouseMiddlePressed 要設定的 mouseMiddlePressed
*/
public void setMouseMiddlePressed(boolean mouseMiddlePressed) {
this.mouseMiddlePressed = mouseMiddlePressed;
}
/**
* @return mouseMiddleRotated
*/
public boolean isMouseMiddleRotated() {
return mouseMiddleRotated;
}
/**
* @param mouseMiddleRotated 要設定的 mouseMiddleRotated
*/
public void setMouseMiddleRotated(boolean mouseMiddleRotated) {
this.mouseMiddleRotated = mouseMiddleRotated;
}
}
}
setHookOn() {
......
User32.INSTANCE.GetMessage(msg, null, 0, 0);
......
或while ((result = User32.INSTANCE.GetMessage(msg, null, 0, 0)) != 0) {
運行后滑鼠鉤子就能成功獲取滑鼠的動作,但是setHookOff()怎么也關閉不了鉤子。
lib.UnhookWindowsHookEx(hhk);執行了,但鉤子依然在運行。
如何取消鉤子
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/269765.html
標籤:Java SE
上一篇:javaweb檔案上傳
