先上图
效果图:
代码框架图:
代码实现大致分为两部分:
1.core audio API实现系统音量的大小控制与静音,由于是封装好的函数,操作起来十分简单。
2.全局钩子。因为要实现监听按键,仅适用线程钩子监听某一个线程是不够的。该部分有难度。
写了四个类:基类hook,子类PublicHook(全局钩子)和PrivateHook(私有钩子),以及调取委托的KeyboardHookStruct(其实我也不太懂(╯﹏╰))
基类hook:
两个子类仅有构造函数继承父类,和重写SetWindowsHookEx:
PrivateHook: hHook = SetWindowsHookEx(this.type, this.proc, IntPtr.Zero, GetCurrentThreadId());
PublicHook: hHook = SetWindowsHookEx(this.type, this.proc,GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0);
键盘委托类含有以下几个属性:
public int vkCode;
public int scanCode;
public int flags;
public int time;
public int dwExtraInfo;
遇到的问题:1.全局钩子的处理事件中使用messagebox会产生很高的系统延迟,5秒左右。
2.键盘钩子每次响应Key_Down和Key_Up事件,会执行两次处理事件操作,通过判断处理事件的参数可以进行筛选。