从Java中捕获鼠标单击并用作热键?
对于键盘,我使用它来捕获键盘输入:JIntellitype 这非常好用,但我还想专门捕获鼠标事件点击,并将其用作全局热键从Java中捕获鼠标单击并用作热键?,java,input,mouse,hotkeys,Java,Input,Mouse,Hotkeys,对于键盘,我使用它来捕获键盘输入:JIntellitype 这非常好用,但我还想专门捕获鼠标事件点击,并将其用作全局热键 平台仅限Windows,语言为Java。我更喜欢一个好的Java包,并且希望避免直接使用JNI/JNA调用或Win32,尽管如果它们在一个好的包装器中,这些都很好。如果您想使用JNA,可以使用类似于以下代码的东西 使用JNA 3.3.0和JNA平台JAR 更多关于LowLevelMouseProc函数和鼠标事件的文档 MouseHook.java: package jnate
平台仅限Windows,语言为Java。我更喜欢一个好的Java包,并且希望避免直接使用JNI/JNA调用或Win32,尽管如果它们在一个好的包装器中,这些都很好。如果您想使用JNA,可以使用类似于以下代码的东西 使用JNA 3.3.0和JNA平台JAR 更多关于LowLevelMouseProc函数和鼠标事件的文档 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;
}
}
如果要使用JNA,可以使用类似于以下代码的代码 使用JNA 3.3.0和JNA平台JAR 更多关于LowLevelMouseProc函数和鼠标事件的文档 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应用程序,我建议您尝试一下。来回答您的第一个问题。假设我在记事本中单击鼠标左键,它会弹出一个菜单。但是,如果我想在我的左键点击热键。我左键点击,它会弹出菜单,maco会自动向下滚动并选择“粘贴”。这是一个简单的例子,但有很多潜力。关于autoit,我们使用它;但充其量也很麻烦。至于其他语言,是的,你可能是正确的;可能有更好的语言来实现这一点,但我有很多想要使用的现有库,也是我的首选语言。我同意AutoIt对于创建GUI来说既麻烦又糟糕,但是对于创建非常小的实用程序来说,它非常好,我在Java GUI中调用这些实用程序取得了一些不错的成功。使用JNA确实可以,想不出更简单的方法。我用JNA做了类似的事情,使用第4/5个鼠标按钮作为全局快捷键。还不算太糟,用了大约150-200行Java代码。@prunge,你可能有什么可以共享的代码吗?如何使用鼠标事件作为热键?此外,似乎您需要一个全局鼠标侦听器,而Java可能不是实现这一点的最佳工具。由于这是一个Windows应用程序,我建议您尝试一下。来回答您的第一个问题。假设我在记事本中单击鼠标左键,它会弹出一个菜单。但是,如果我想在我的左键点击热键。我左键点击,它会弹出菜单,maco会自动向下滚动并选择“粘贴”。这是一个简单的例子,但有很多潜力。关于autoit,我们使用它;但充其量也很麻烦。至于其他语言,是的,你可能是正确的;可能有更好的语言来实现这一点,但我有很多想要使用的现有库,也是我的首选语言。我同意AutoIt对于创建GUI来说既麻烦又糟糕,但是对于创建非常小的实用程序来说,它非常好,我在Java GUI中调用这些实用程序取得了一些不错的成功。使用JNA确实可以,想不出更简单的方法。我用JNA做了类似的事情,使用第4/5个鼠标按钮作为全局快捷键。还不算太糟,用了大约150-200行Java代码。@prunge,你有没有可以共享的代码?