1
對於鍵盤,我用這個來捕獲鍵盤輸入:JIntellitype從Java中捕獲鼠標點擊並用作熱鍵?
這個作品非常好,但我也想捕捉鼠標事件(特別是點擊),並把它們作爲全球的「熱鍵」。
平臺只有Windows,語言是Java。我更喜歡一個不錯的Java包,並希望避免直接使用JNI/JNA調用或Win32(如果它們在一個很好的包裝中,這些都沒問題)。
對於鍵盤,我用這個來捕獲鍵盤輸入:JIntellitype從Java中捕獲鼠標點擊並用作熱鍵?
這個作品非常好,但我也想捕捉鼠標事件(特別是點擊),並把它們作爲全球的「熱鍵」。
平臺只有Windows,語言是Java。我更喜歡一個不錯的Java包,並希望避免直接使用JNI/JNA調用或Win32(如果它們在一個很好的包裝中,這些都沒問題)。
如果你想使用JNA,你可以使用類似於下面的代碼。
使用JNA 3.3.0和JNA平臺JAR。
更多關於LowLevelMouseProc函數的doco here和鼠標事件here。
MouseHook.java:
package jnatest;
import jnatest.WinUserX.LowLevelMouseProc;
import jnatest.WinUserX.MSLLHOOKSTRUCT;
import com.sun.jna.platform.win32.Kernel32;
import com.sun.jna.platform.win32.User32;
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;
import com.sun.jna.platform.win32.WinUser.HHOOK;
import com.sun.jna.platform.win32.WinUser.MSG;
public class MouseHook
{
private static volatile boolean quit;
private static HHOOK hhk;
private static LowLevelMouseProc mouseHook;
public static void main(String[] args)
{
System.out.println("Press middle button to quit.");
final User32 lib = User32.INSTANCE;
HMODULE hMod = Kernel32.INSTANCE.GetModuleHandle(null);
mouseHook = new LowLevelMouseProc()
{
public LRESULT callback(int nCode, WPARAM wParam, MSLLHOOKSTRUCT info)
{
if (nCode >= 0)
{
switch (wParam.intValue())
{
case WinUserX.WM_LBUTTONDOWN:
System.out.println("Left button click at " + info.pt.x + ", " + info.pt.y);
break;
case WinUserX.WM_LBUTTONUP:
System.out.println("Left button release.");
break;
case WinUserX.WM_MBUTTONDOWN:
System.out.println("Middle button.");
quit = true;
break;
}
}
return lib.CallNextHookEx(hhk, nCode, wParam, info.getPointer());
}
};
hhk = lib.SetWindowsHookEx(WinUser.WH_MOUSE_LL, mouseHook, hMod, 0);
new Thread()
{
public void run()
{
while (!quit)
{
try { Thread.sleep(10); } catch(InterruptedException e) { }
}
System.err.println("unhook and exit");
lib.UnhookWindowsHookEx(hhk);
System.exit(0);
}
}.start();
// This bit never returns from GetMessage
int result;
MSG msg = new MSG();
while ((result = lib.GetMessage(msg, null, 0, 0)) != 0)
{
if (result == -1)
{
System.err.println("error in get message");
break;
}
else
{
System.err.println("got message");
lib.TranslateMessage(msg);
lib.DispatchMessage(msg);
}
}
lib.UnhookWindowsHookEx(hhk);
}
}
WinUserX.java:
package jnatest;
import com.sun.jna.Structure;
import com.sun.jna.platform.win32.BaseTSD.ULONG_PTR;
import com.sun.jna.platform.win32.WinDef.LRESULT;
import com.sun.jna.platform.win32.WinDef.WPARAM;
import com.sun.jna.platform.win32.WinUser;
public interface WinUserX extends WinUser
{
public int WM_LBUTTONDOWN = 0x0201;
public int WM_LBUTTONUP = 0x0202;
public int WM_MOUSEMOVE = 0x0200;
public int WM_MOUSEWHEEL = 0x020A;
public int WM_MOUSEHWHEEL = 0x020E;
public int WM_RBUTTONDOWN = 0x0204;
public int WM_RBUTTONUP = 0x0205;
public int WM_MBUTTONDOWN = 0x0207;
public interface LowLevelMouseProc extends HOOKPROC
{
LRESULT callback(int nCode, WPARAM wParam, MSLLHOOKSTRUCT lParam);
}
public class MSLLHOOKSTRUCT extends Structure
{
public POINT pt;
public int mouseData;
public int flags;
public int time;
public ULONG_PTR dwExtraInfo;
}
}
如何使用鼠標事件作爲一個熱鍵?此外,它好像你想要一個全局鼠標監聽器,Java可能不是最好的工具。相反,因爲這是一個Windows應用程序,我建議您嘗試[AutoIt v3](http://www.autoitscript.com/site/)。 –
回答你的第一個問題。假設我在記事本中點擊了一下,就會彈出一個菜單。但是說我想要左鍵點擊一個熱鍵。我點擊左鍵,它會顯示菜單和maco kick,並且選擇「粘貼」。這是一個簡單的例子,但很有潛力。關於autoit,我們使用它;但最好是很麻煩。至於其他語言,是的,你可能是正確的;這可能有更好的語言,但我有很多現有的庫,我想使用,也是我的首選語言。 – user697111
我同意AutoIt創建圖形用戶界面非常麻煩,但創建非常小的實用程序非常棒,我從Java GUI中調用這些實用程序已經有一些體面的成功。 –