简单的鼠标切换左右键(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