简单的鼠标切换左右键(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() {@Overridepublic void mouseReleased(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mousePressed(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseExited(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseEntered(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseClicked(MouseEvent e) {Thread thread = new Thread(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubString str = (textField.getText());if (str == null || str.equals("")) {flag = !flag;MainFactory.SwapMouseButton(flag);if(flag)label.setText("您现在用的是右手鼠标");elselabel.setText("您现在用的是左手鼠标");} else {try {int time = Integer.parseInt(str);Calendar calendar = Calendar.getInstance();Calendar calendar2 = Calendar.getInstance();flag= !flag;if(flag)label.setText("您现在用的是右手鼠标");elselabel.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("您现在用的是右手鼠标");elselabel.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() {@Overridepublic void mouseReleased(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mousePressed(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseExited(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseEntered(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseClicked(MouseEvent e) {// TODO Auto-generated method stubflag = 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

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

  1. 检测鼠标按钮(左右键)是否交换

     假设的应用场景: 当hook住鼠标按钮被按下的事件时, 要先执行鼠标按钮被按下的自定义处理,再转到处理鼠标被按下的事件. 假设自定义处理为: 将鼠标光标所在的按钮禁止和隐藏. 实现流程: * 得 ...

  2. office 2007 鼠标、左右键失效

    安装了office2003,升级到Office2007后,先打开一个word文件,切换出去,再切回来,鼠标失效,左右键在编辑区不能用. 网上搜索,找到原因是由于PowerDesigner12插件造成. ...

  3. 凯撒加密的最简单的理解与实现(Java版)

    凯撒加密 前言 这是我的第一篇博客希望以后多多关注. 这篇文章起源于我在人工智能导论上的一次摸鱼◔ ‸◔,当时老师一节课都在脱离课本介绍,讲什么网络安全之类的问题,后面还举例子了一些加密方法巴拉巴拉, ...

  4. gb28181简单实现sip信令服务器(java版基于springboot):四、sip摄像头心跳保活、推流(tcp/udp)和结束推流

    心跳文本 //摄像头发送过来的Keepalive保活信息 MESSAGE sip:34020000002000000001@192.168.1.201:5060 SIP/2.0 //MESSAGE 方 ...

  5. gb28181简单实现sip信令服务器(java版基于springboot):一、netty创建udp服务器

    以下仅代表个人理解,仅供参考,欢迎大佬纠正!!! maven依赖 <!-- springboot配置依赖 --> <dependency><groupId>org. ...

  6. 【图】Dijkstra(迪杰特斯拉)算法、左神Java版

    什么是Dijkstra 给定一个图,从某点出发到达某点给出最短的路径 比如上述图,从A出发,到其余点的最短路径,返回这样的表 思路 我们先用一个表格记录A到其余点的距离,初始值是A到A的距离为0,与其 ...

  7. C#切换鼠标左右键习惯

    本人一直喜欢左手使用鼠标,但有时候同事会临时进行操作,还得在控制面板里进行更改,比较不便,何不编写一个控制台程序,双击一下即可切换左右键 代码很简单: class Program { [DllImpo ...

  8. java vk减号_[原]在全局鼠标钩子中模拟鼠标右键单击

    //bSwap:BOOL型 //为TRUE为切换左右键功能,为FALSE为恢复原左右键功能 ::SwapMouseButton(bSwap); 可以使用RegisterHotKey()注册一个热键,在 ...

  9. iMouse - 快速切换鼠标左右键

    (此Blog是iMouse软件的官网) [名称]:iMouse [版本]:v1.2 (v1.2是首个公开发布版本,也是最新版,之前版本没有对外发布) [时间]:2012-01-06 [关键词]:腱鞘炎 ...

最新文章

  1. 你们要的动图来了:2张动图快速理解高内聚与低耦合
  2. Java 洛谷 P2141 珠心算测验
  3. 你真的了解 i++, ++i 和 i+++++i 以及 i+++i++ 吗?
  4. 操作系统(二十五)吸烟者问题-单生产者多消费者问题
  5. 杭州人有福了!菜鸟配送升级新增24小时送药服务
  6. 2019最后一个月Python继续霸榜,想上车?看这份书单
  7. python画三维图-Python使用matplotlib绘制三维图形示例
  8. 主题目录检索是什么举例子_网络信息资源检索与利用第二次作业
  9. c++ string split_闲话Python之砍瓜切菜split()
  10. c语言入门介绍 Hello, World
  11. 金税盘计算机USB无法识别,金税盘无法识别怎么办
  12. 计算机应用基础电子教案吉林,中等职业学校计算机应用基础课程改革初探.doc...
  13. B 罗马数字 2018浙江理工大学新生赛
  14. 新浪微博错误提示代码
  15. linux dot命令,linux绘图工具之dot
  16. 数据挖掘基础:独立性检验
  17. winds以管理员身份运行命令提示符
  18. 机器学习中的特征缩放(feature scaling)浅谈
  19. (6)物体6自由度位姿估计主流方法----待完善
  20. Damien Katz弃Apache CouchDB,继以Couchbase Server

热门文章

  1. jQuery学习笔记【黑马程序员】
  2. 四散而开的小蝌蚪(Tadpole)
  3. SpringBoot2.x系列教程75--SpringBoot整合JPA、Redis实现分布式的Session共享
  4. USB_HID设备实例
  5. 软件无线电 | hackrf one 教程学习笔记lesson4-11
  6. 【高性能】生成唯一时间戳ID,1毫秒预计能生成1000个
  7. java小游戏-java小游戏-黄金矿工
  8. 科目三 补考 注意事项
  9. 【TWS API使用教程5】---如何使用TWS API在盈透证券中下单(place order)、获取订单信息、获取持仓、获取账户汇总信息?
  10. linux subsystem,subsystem