在去年使用了一款软件,软件理念是:为常用操作建立捷径,让效率触手可及!

试了一下,确实很方便,软件设置里有个小功能,很好用,我特别喜欢。

某软件截图.png

当时软件更新版本比较频繁,后来也出了会员制,软件优化处理的不是很好,有时候用起来卡卡的,我就有点想放弃这个软件了。现在我办公室的电脑已经卸载了这个软件,我自己的电脑还留着。

但是我有点舍不得这个小功能,用习惯了真的很上手,很方便。

我就萌生了一个想法:我要自己把这个小功能写出来。

刚开始写了鼠标滚轮事件,从网上查找资料,参考别人的写法,判断滚轮方向和修改系统音量已经实现了。

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#中处理全局鼠标和键盘挂钩

CodeProject.png

然后我就能进行愉快的写作了~~

代码截图.png

实现功能:
鼠标放在屏幕最顶端或最底端,可以使用鼠标滚轮来调整系统的音量大小。滚轮向上:增加音量/Vol+,滚轮向下:减小音量/Vol-
增加了最小化/关闭自动隐藏到系统托盘。
双击托盘图标可以显示界面。

软件截图.png

软件成品下载:

保持exe和dll在同一目录下即可。

如果你个人比较喜欢这个,可以将软件手动设置为开机启动。无后顾之忧。

小白一枚,写的不好,请多多见谅。如有错误请指出。谢谢!

Last modification:March 17th, 2020 at 09:50 am
如果觉得我的文章对你有用,请随意赞赏