【原】简单的鼠标切换左右键(java版)

简单的鼠标切换左右键(java版)

0. 写在最前面

客户需要一个能切换左右键的小功能满足使用需要。
具体需要如下:
我需要一个独立运行的窗口,在其中输入数字x,按下“转换”按钮后,鼠标左右键互换x秒,不输入数字的情况下按下按钮则永久转换。窗口关闭后,鼠标状态还原
任意语言都可以,需要在win7 和 win10下运行

1. 踩坑过程

看到这个需求,我第一反应是用python的robot来获取当前的点击位置,然后模拟另一个按键的点击,后来在处理“模拟另一个按键点击”时失败。
后来发现C#版本的的开源项目Xmouse(见相关资料3),发现可以调用windows下的dll搞定。不过,我的电脑没装vs(感觉vs很大,然而很少开发C#项目),就考虑用java去调dll实现功能。
当笔者在写这个文档的时候,查到了鼠标操作的C++的API的文档(见相关资料2)

2. java实现的鼠标切换左右键

我并没有度到java实现鼠标切换左右键的方法,又没有VS,只好自己实现了一个java版(见相关资料4)的
代码的核心在于java调用windows的dll,参考博文几种java调用dll的方式(见相关资料5),选用jna的方式调用dll

3. CODE(java)

package ltd.snowland.func;


import com.sun.jna.Library;  
import com.sun.jna.Native;  
import com.sun.jna.Platform;  

public class MainFactory {
    // 定义接口CLibrary,继承自com.sun.jna.Library  
    public interface mousedll extends Library {  
        // user32为dll名称,msvcrt目录的位置为:C:\Windows\System32下面,  
        mousedll Instance = (mousedll) Native.loadLibrary((Platform.isWindows() ? "user32" : "c"),  
                mousedll.class);  
        public boolean SwapMouseButton(boolean fSwap);  

    }  

    public static boolean SwapMouseButton(boolean f) {
        return mousedll.Instance.SwapMouseButton(f);
    }
}
package ltd.snowland.ui;

import java.awt.EventQueue;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Calendar;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;

import ltd.snowland.func.MainFactory;

public class MainFrame extends JFrame {
    /**
     * 
     */
    private static final long serialVersionUID = 7295192409169107006L;
    private JPanel contentPane;
    private JLabel label;
    private JTextField textField;
    boolean flag = false;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    MainFrame frame = new MainFrame();
                    frame.setVisible(true);

                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public MainFrame() {
        MainFactory.SwapMouseButton(false);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);

        JButton button = new JButton("\u8F6C\u6362");
        button.addMouseListener(new MouseListener() {

            @Override
            public void mouseReleased(MouseEvent e) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mousePressed(MouseEvent e) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mouseExited(MouseEvent e) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mouseEntered(MouseEvent e) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mouseClicked(MouseEvent e) {

                Thread thread = new Thread(new Runnable() {

                    @Override
                    public void run() {
                        // TODO Auto-generated method stub
                        String str = (textField.getText());
                        if (str == null || str.equals("")) {
                            flag = !flag;
                            MainFactory.SwapMouseButton(flag);
                            if(flag)
                            label.setText("您现在用的是右手鼠标");
                            else
                                label.setText("您现在用的是左手鼠标");

                        } else {

                            try {
                                int time = Integer.parseInt(str);
                                Calendar calendar = Calendar.getInstance();
                                Calendar calendar2 = Calendar.getInstance();
                                flag= !flag;
                                if(flag)
                                    label.setText("您现在用的是右手鼠标");
                                    else
                                        label.setText("您现在用的是左手鼠标");
                                MainFactory.SwapMouseButton(flag);
                                while (true) {
                                    if (calendar2.getTimeInMillis() > calendar.getTimeInMillis() + time) {
                                        break;
                                    }
                                    Thread.sleep(10);
                                    calendar2 = Calendar.getInstance();

                                }
                                flag = ! flag;
                                MainFactory.SwapMouseButton(flag);
                                if(flag)
                                    label.setText("您现在用的是右手鼠标");
                                else
                                    label.setText("您现在用的是左手鼠标");
                            } catch (Exception e2) {

                            }
                        }

                    }
                });

                thread.start();

            }
        });

        button.setBounds(120, 148, 93, 23);
        contentPane.add(button);

        textField = new JTextField();
        textField.setBounds(160, 86, 113, 21);
        contentPane.add(textField);
        textField.setColumns(10);

        JLabel lblNewLabel = new JLabel("\u65F6\u95F4");
        lblNewLabel.setBounds(120, 89, 54, 15);
        contentPane.add(lblNewLabel);

        JButton button_1 = new JButton("复位");

        button_1.addMouseListener(new MouseListener() {

            @Override
            public void mouseReleased(MouseEvent e) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mousePressed(MouseEvent e) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mouseExited(MouseEvent e) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mouseEntered(MouseEvent e) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mouseClicked(MouseEvent e) {
                // TODO Auto-generated method stub
                    flag = false;
                    MainFactory.SwapMouseButton(false);
                    label.setText("您现在用的是右手鼠标");
                }

        });

        button_1.setBounds(223, 148, 93, 23);
        contentPane.add(button_1);

        label = new JLabel("\u60A8\u73B0\u5728\u662F\u53F3\u624B\u9F20\u6807");
        label.setBounds(143, 200, 143, 15);
        contentPane.add(label);
    }
}

4. 写在最后

实际上,鼠标主次键转化已经有比较成熟的软件,比如G-Mouse(见相关资料1),但是由于这是我第一次跨平台调库,所以还是记录下来。功能不难,实用为主,此为后记。

相关资料

[1] G-Mouse 下载地址 http://www.xiazaiba.com/html/26239.html 2018-2-25
[2] Visual C++6.0 【鼠标操作】API函数操作技巧集 http://blog.csdn.net/jianxiong8814/article/details/1631097 2018-2-24
[3] C#开源项目Xmouse https://github.com/robotbird/Xmouse 2018-2-24
[4] java开源项目snowland-mouse https://gitee.com/snowlandltd/snowland-mouse 2018-2-25
[5] 几种java调用dll的方式 http://blog.csdn.net/a491857321/article/details/51504094 2018-2-25

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

A.Star

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值