Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Java中捕获鼠标单击并用作热键?_Java_Input_Mouse_Hotkeys - Fatal编程技术网

从Java中捕获鼠标单击并用作热键?

从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

对于键盘,我使用它来捕获键盘输入:JIntellitype

这非常好用,但我还想专门捕获鼠标事件点击,并将其用作全局热键


平台仅限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,你有没有可以共享的代码?