我的.NET生活

活着便精彩!
随笔 - 41, 评论 - 680, 引用 - 66

导航

关于

标签

每月存档

最新留言

广告

 

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

当然,自从我给电脑同时接上左右两只鼠标以后,来回调换鼠标是避免了(据我所知,有在电脑上接三四只鼠标的,真是厉害!),但系统对于鼠标左右键的安排却不听我的调换,还要费力地去控制面板中设置一番,非常麻烦。因此我想,何不写几行代码,让鼠标左右键能在最短的时间内左右切换呢?这主意不错!OK,马上到MSDN里查找一番,十几分钟写出了下面这个小程序。

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

OK,把上述几点连起来,就可以轻松写成一个能快速切换鼠标功能键的小程序了。我把这个小程序放在系统托盘里,只需单击一下它的图标就能在左手和右手鼠标之间进行快速切换,同时通过图标的方向变化来指示当前的鼠标状态。这样我就再也不必为切换鼠标的事而头疼了:)

打印 | 张贴于 2004-10-21 16:07:00 | Tag:暂无标签

留言反馈

#回复: 用C#实现鼠标左右键自动切换 编辑
[url=http://www.tanshua.com]碳刷[/url]
[url=http://www.mmosgames.com]runescape money[/url]
2008-01-22 15:06:00 | [匿名:ww]
#回复: 用C#实现鼠标左右键自动切换 编辑
2007-12-18 05:09:00 | [匿名:wow power leveling]
#想试用一下 编辑
邮箱:mclxf@sina.com,谢谢
2007-08-29 10:01:00 | [匿名:machenglxf]
#re: 用C#实现鼠标左右键自动切换 编辑
很好
2005-12-07 01:10:00 | [匿名:wwww]
#re: 用C#实现鼠标左右键自动切换 编辑
我觉得anuxs的提议很好,不知道作者能否实现?


我提点建议,再进一步,不用点什么图标了,动哪只mouse,就使用哪只mouse的设置。这样最简单好用了。
2005-12-03 20:48:00 | [匿名:ZY liu]
#re: 用C#实现鼠标左右键自动切换 编辑
麻烦把这工具传我一份好吗,谢谢
pooronce@msn.com
2005-11-29 01:50:00 | [匿名:pooronce]
#re: 用C#实现鼠标左右键自动切换 编辑
hi, please give me a reply
jxh047000@utdallas.edu
Thanks very much.
2004-12-01 14:05:00 | [匿名:materofpuppet]
#re: 用C#实现鼠标左右键自动切换 编辑
我提点建议,再进一步,不用点什么图标了,动哪只mouse,就使用哪只mouse的设置。这样最简单好用了。
2004-10-25 18:04:00 | [匿名:anuxs]
#re: 用C#实现鼠标左右键自动切换 编辑
其实我经常换鼠标也不是为了换而换。用电脑时间长了,真的感到肩和手腕会不太舒服,虽然也不影响大局,但适当地注意些还是有必要的。

有同感啊,我也是这么办的,可惜我的笔记本在控制面板上不支持usb口的左右切换,只有一个ps/2口,这个程序太及时了
2004-10-23 16:16:00 | [匿名:之间]
#re: 用C#实现鼠标左右键自动切换 编辑
@JGTM'2004 [MVP]

多谢提醒!是我写的时候马虎了,刚刚改过。nIndex, nIndex, nIndex, nIndex...
2004-10-22 12:26:00 | [匿名:musicland]
#re: 用C#实现鼠标左右键自动切换 编辑
其实我经常换鼠标也不是为了换而换。用电脑时间长了,真的感到肩和手腕会不太舒服,虽然也不影响大局,但适当地注意些还是有必要的。
当然解决办法也不一定是换用左手鼠标——这只是诸多解决方法之一,最常用的其实就是隔段时间站起来活动活动,让自己的身体refresh一下。IT人更要关爱自己的健康嘛。:)
希望我们每个人都健健康康的!
2004-10-22 12:23:00 | [匿名:musicland]
#re: 用C#实现鼠标左右键自动切换 编辑
你强,,我不仅买不起两个鼠标

而且用不惯左手鼠标
2004-10-22 11:08:00 | [匿名:tinyfool]
#re: 用C#实现鼠标左右键自动切换 编辑
GetSystemMetrics()声明的参数名称写错了,应该是nIndex,调用的时候才需要传入那个常量。不好意思是我的错,第一遍没看仔细。改过删掉这条就好了。:)
2004-10-22 08:51:00 | [匿名:JGTM'2004 [MVP]]
#re: 用C#实现鼠标左右键自动切换 编辑
还要加上
using System.Runtime.InteropServices; 声明
2004-10-21 17:46:00 | [匿名:magicwind]
#re: 用C#实现鼠标左右键自动切换 编辑
有趣,可是偶却没有$去买那么多的鼠标来测试...
2004-10-21 17:40:00 | [匿名:lion]
对不起,目前本随笔不允许发表新评论.

Powered by: Joycode.MVC引擎 0.5.2.0