在去年使用了一款软件,软件理念是:为常用操作建立捷径,让效率触手可及! 试了一下,确实很方便,软件设置里有个小功能,很好用,我特别喜欢。  当时软件更新版本比较频繁,后来也出了会员制,软件优化处理的不是很好,有时候用起来卡卡的,我就有点想放弃这个软件了。现在我办公室的电脑已经卸载了这个软件,我自己的电脑还留着。 但是我有点舍不得这个小功能,用习惯了真的很上手,很方便。 我就萌生了一个想法:我要自己把这个小功能写出来。 刚开始写了鼠标滚轮事件,从网上查找资料,参考别人的写法,判断滚轮方向和修改系统音量已经实现了。 ```csharp private void HookManager_MouseWheel(object sender, MouseEventArgs e) { Point p1 = Cursor.Position;//获取当前鼠标坐标 int W = Screen.PrimaryScreen.Bounds.Width;//获取显示器的宽 int H = Screen.PrimaryScreen.Bounds.Height;//获取显示器的高 if ((e.Delta > 0 && p1.Y == 0) || (e.Delta > 0 && p1.Y == H - 1)) { SendMessageW(this.Handle, WM_APPCOMMAND, this.Handle, (IntPtr)APPCOMMAND_VOLUME_UP); notifyIcon.ShowBalloonTip(500, "提示", "音量+", ToolTipIcon.Info); } else if ((e.Delta < 0 && p1.Y == 0) || (e.Delta < 0 && p1.Y == H - 1)) { SendMessageW(this.Handle, WM_APPCOMMAND, this.Handle, (IntPtr)APPCOMMAND_VOLUME_DOWN); notifyIcon.ShowBalloonTip(500, "提示", "音量-", ToolTipIcon.Info); } } ``` 可是这个蛋疼的滚轮事件,在窗体失焦后就无法触发了。也就是说软件最小化或者点到软件外面去了根本不会触发这个事件。这个问题让我蛋疼了两三天。 周末在家打扫卫生的时候,灵光一现,不论窗体是否失焦,将系统全局的滚轮事件拦截下来,让他强制执行指定代码,就能解决了。 后来,我从网友的口中得知,这个技术叫做`钩子程序`,也称作`Hook`。 > Hook是Windows中提供的一种用以替换DOS下“中断”的系统机制,中文译为“挂钩”或“钩子”。在对特定的系统事件进行hook后,一旦发生已hook事件,对该事件进行hook的程序就会收到系统的通知,这时程序就能在第一时间对该事件做出响应。 今天早上在吾爱发了帖子,请教了一下,网友给我推荐了一个国外的社区链接,里面有作者写好的demo,看了一下对我的帮助很大。 `点我到达↓` [在C#中处理全局鼠标和键盘挂钩](https://www.codeproject.com/Articles/7294/Processing-Global-Mouse-and-Keyboard-Hooks-in-C "在C#中处理全局鼠标和键盘挂钩")  然后我就能进行愉快的写作了~~  实现功能: 鼠标放在屏幕最顶端或最底端,可以使用鼠标滚轮来调整系统的音量大小。滚轮向上:增加音量/`Vol+`,滚轮向下:减小音量/`Vol-`。 增加了最小化/关闭自动隐藏到系统托盘。 双击托盘图标可以显示界面。  软件成品下载: 提取码: uas3 保持exe和dll在同一目录下即可。 如果你个人比较喜欢这个,可以将软件手动设置为开机启动。无后顾之忧。 小白一枚,写的不好,请多多见谅。如有错误请指出。谢谢! Last modification:March 17th, 2020 at 09:50 am © 允许规范转载 Support 如果觉得我的文章对你有用,请随意赞赏 Appreciate the author 支付宝微信
2 comments
来看看