转载地址:http://www.51test.net/show.asp?id=283640&Page=1#top

1. SwapMouseButton

  根据MSDN所述,可以通过调用SwapMouseButton这一API来实现鼠标左右键功能互换,Windows控制面板中的相关设置也是通过调用该API来实现的。该API存在于user32.dll文件中,它的原型是:

  BOOL SwapMouseButton(
  BOOL fSwap
  );

  我们可以在.NET工程中通过P/Invoke轻松声明对该API的调用。我写的调用声明如下:

  // P/Invoke declarations
  [DllImport("user32.dll")]
  private extern static bool SwapMouseButton(bool fSwap);

  其中,fSwap是唯一需要传入的参数,当它的值为true时,系统会把鼠标左右键功能进行互换(即换成左手鼠标);当它的值为false时,系统会把鼠标左右键功能还原为默认状态(即右手鼠标)。因此,当我想使用左手鼠标时,只需向SwapMouseButton方法传入一个true变量即可实现,非常方便。

  2. SystemParametersInfo

  除了调用SwapMouseButton来实现鼠标左右值功能切换之外,Windows还提供了另外一个实现同样效果的API:SystemParametersInfo。根据MSDN,该API的原型是:

  BOOL SystemParametersInfo(
  UINT uiAction,
  UINT uiParam,
  PVOID pvParam,
  UINT fWinIni
  );

  用C#可以进行如下声明:

  [DllImport("user32.dll")]
  private extern static int SystemParametersInfo(uint uiAction, uint
  uiParam, IntPtr pvParam, uint fWinIni);

  其中,uiAction指定一个需要获取的系统参数,如屏幕大小、分辨率、鼠标配置等,如果传入参数SPI_SETMOUSEBUTTONSWAP就可以用来设置鼠标功能切换;当向uiParam参数传入正值时,系统就会把鼠标左右键功能进行互换(即换成左手鼠标),当向uiParam传入0时,系统还会把鼠标功能还原成默认状态(即还原为右手鼠标)。

  由此,我们需要在uiAction位置传入SPI_SETMOUSEBUTTONSWAP。不过很明显,SPI_SETMOUSEBUTTONSWAP只是C语言中#define编译预定义指令所定义出的一个常量,我们必须在C#代码中对它进行重新定义。OK,打开Winuser.h头文件,在其中搜索SPI_SETMOUSEBUTTONSWAP,找到如下定义(位于8623行):

  #define SPI_SETMOUSEBUTTONSWAP 33

  可见,SPI_SETMOUSEBUTTONSWAP定义的是整型值33,这样我们就可以在C#中做出如下定义:

  private const uint SPI_SETMOUSEBUTTONSWAP = 33;

 3. GetSystemMetrics

  通过上述两种方法,我们都可以轻松地实现鼠标功能切换了。不过,在每次切换之前,如果我们的应用程序能够获知系统当前的鼠标设 置,那么就可以决定该向哪个(相反)方向进行切换,从而给使用者带来一种更好的用户体验。那么该怎样才能获知当前系统的鼠标设置呢?GetSystemMetrics可以解决这一问题。

  根据MSDN,GetSystemMetrics的原型是:

  int GetSystemMetrics(
  int nIndex
  );

  其中nIndex参数有SM_SWAPBUTTON值可选,SM_SWAPBUTTON在Winuser.h头文件中的定义是:

  #define SM_SWAPBUTTON 23

  我们可以在C#中如此定义SM_SWAPBUTTON:

  private const int SM_SWAPBUTTON = 23;

  声明GetSystemMetrics:

  [DllImport("user32.dll")]
  private extern static int GetSystemMetrics(int nIndex); // Updated 04.10.22. Many thanks to JGTM'2004 [MVP]

  当GetSystemMetrics返回0时,表明当前系统鼠标设为默认状态(右手鼠标),否则表明鼠标已被设为左手鼠标。这样,我们就可以在切换鼠标状态之前获知系统的当前鼠标状态,从而可以做出相反方向的切换了。

用C#实现鼠标左右键的切换相关推荐

  1. c语言鼠标左右键怎么互换,用C#实现鼠标左右键的切换

    在平时用电脑的过程中,我喜欢隔段时间就把鼠标左右调换一下,一来是想让自己一侧的肩.手臂.手腕能得到休息,尽量避免因长期固定姿势使用鼠标而带来的身体不适,另一方面也因为我本来就是个左撇子,喜欢尝试给两只 ...

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

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

  3. linux下模仿用户左键,linux 鼠标左右键互换实现代码

    linux鼠标左右键互换脚本,作者今天, 使用 GNOME, 发现 Linux 也需要这些工具之一, 所以有了这个脚本.非常简单好用. lr="l" for id in `xinp ...

  4. 转载:注册表修改--鼠标左右键菜单篇

    注册表修改--鼠标左右键菜单篇 加Apploc到右键中去: [HKEY_CLASSES_ROOT\exefile\shell\Apploc\command] 再修改其中的默认值为C:\windows\ ...

  5. linux 鼠标 反向,linux 鼠标左右键互换实现代码

    linux鼠标左右键互换脚本,作者今天, 使用 GNOME, 发现 Linux 也需要这些工具之一, 所以有了这个脚本.非常简单好用. lr="l" for id in `xinp ...

  6. 【Bug】01_VMware虚拟机中鼠标左右键失灵

    01 问题描述: VMware进入系统(ubuntu16.04&14.04),鼠标左右键失效. 具体表现为:自宿主系统进入VM鼠标左右键有效,1-3秒过后,鼠标失效:同时,鼠标滚轮有效,且当鼠 ...

  7. 戴记严选GM3323D 鼠标左右键失效 解决办法

    戴记严选 GM3323D 鼠标左右键失效原因分析 GM3323D软件下载 当你下载了驱动了并且使用2.4G连接鼠标时,当你修改RGB设置有几率导致左右键失效 请尝试用触摸板或者其他鼠标 重新点击修改R ...

  8. C#Winform中DataGridView控件根据鼠标左右键获取单元格值或者行列

    有多种方法可以获取单元格的值或者行列,此处选用了两种方式去获取分别用了CurrentCell方法和Rows[].Cells[]的方法去获取行列值 鼠标左键获取单独行列值 此处获取左键行列值的触发条件是 ...

  9. php左键点改成左键点,window_win10怎么将鼠标左键设置为主键?win10鼠标左右键互换的技巧,当我们的鼠标使用一段时间之 - phpStudy...

    win10怎么将鼠标左键设置为主键?win10鼠标左右键互换的技巧 当我们的鼠标使用一段时间之后,会由于左键经常按压而导致老化或者损坏,而对于突然间的损坏,又没有其他可以替代的鼠标时候,就需要对鼠标左 ...

最新文章

  1. 10分钟写一个markdown编辑器
  2. windows下生成github ssh key详解
  3. Spring MVC原理及配置详解
  4. python各种数据类型的常用方法_Python之数据类型的常用方法
  5. 小程序基础能力~网络
  6. Atlas 2.1.0 实践之编译Atlas-Hive
  7. 免费搭建私人云盘+内网渗透+不限速无限存储
  8. 查看MXNet模型结构
  9. 计算机应用基础—多媒体技术(二)
  10. 商务协同办公市场有「后浪」
  11. u深度重装系统详细教程_u深度u盘启动盘安装win7详细步骤
  12. POI导出Excel(二)
  13. 【C++】读取txt文件中指定行的内容
  14. 2021英伟达暑期实习面经(芯片设计)
  15. CodeM资格赛E 数码 题解
  16. mysql5.1升级到5.6_mysql升级5.1到5.6
  17. 储能双向变流器(PCS)设备中的电流检测方法
  18. shell 对字符串去重并排序
  19. 跟我一起用思维导图复习中小学课本名著
  20. springboot+Quartz整合!!!简单实用

热门文章

  1. Win11新电脑开机怎么跳过登录microsoft账户?
  2. Angular页面出不来,显示空白页面。。。
  3. 使用GI Agent(XAG)实现GoldenGate的高可用性(二)
  4. 关于储备(应急储备、管理储备、储备分析)的总结讨论
  5. 【注释张豪华版 Path酷炫动画】极速get花式Path (支付宝支付成功动画)
  6. 计算机一级ms office模拟真题,2016计算机一级《MS Office》模拟练习题(含答案)
  7. matlab学习笔记9 高级绘图命令_2 图形的高级控制_视点控制和图形旋转_色图和颜色映像_光照和着色
  8. 微信小程序如何实时监测网络状态变化?
  9. 【Web】Hexo+Butterfly+Github+Coding搭建个人博客
  10. 中国联通cdma 1x和中国移动gprs数据业务比较