我个人觉得还这种监视热键比较好用
可能是我有强迫症吧 总是喜欢程序打开后在我指定的位置
所以更喜欢这个取任务栏高度
.版本 2
.程序集 集_监视热键
.子程序 撤消监视热键, 逻辑型, 公开, 撤消由监视热键注册的一个或全部热键(成功返回真,失败返回假)
.参数 集_Hook, 整数型, , 监视热键
.参数 集_监视事件, 子程序指针, , 监视热键
.参数 热键标识, 整数型, 可空, 欲撤消的热键标识,如果留空则撤消全部热键
.局部变量 i, 整数型
.计次循环首 (取数组成员数 (监视热键_信息), i)
.如果 (热键标识 = 0)
监视热键_信息 [i].标识 = 0
.否则
.如果真 (热键标识 = 监视热键_信息 [i].标识)
监视热键_信息 [i].标识 = 0
返回 (真)
.如果真结束
.如果结束
.计次循环尾 ()
返回 (热键标识 = 0)
.子程序 监视热键, 整数型, 公开, 监视一个热键,当热键被触发时激活响应事件.(成功返回热键标识,失败返回0).注:必须真实的按键才会触发热键
.参数 响应事件, 子程序指针, , 响应事件(热键标识,其它...),事件参数数目不限!如果再次监视热键将响应事件!
.参数 键代码, 整数型, , 触发事件的基本键,事件在基本键按下时触发,负数为放开时触发,1鼠标左键,2鼠标右键,更多查询相关帮助
.参数 功能键状态, 整数型, 可空, 1 Alt 2 Ctrl 4 Shift 8 Win 若要两个或以上的状态键,则把它们的值相加.
.参数 其它键, 整数型, 可空, 如果你需要注册由两个普通键组合的热键,可设置一个其它键代码.
.参数 周期, 整数型, 可空, 默认为10,监视热键的周期时间(建议5-200之间)
.参数 直接触发, 逻辑型, 可空, 默认为假:创建新的线程事件 真:直接调用事件等待返回
.局部变量 临时热键信息, 热键信息2
.局部变量 i, 整数型
.如果真 (到字节 (取绝对值 (键代码)) ≤ 0)
返回 (0)
.如果真结束
.计次循环首 (取数组成员数 (监视热键_信息), i)
.如果真 (监视热键_信息 [i].普通键 = 键代码 且 监视热键_信息 [i].功能键 = 功能键状态 且 监视热键_信息 [i].其它键 = 其它键)
监视热键_信息 [i].事件子程序 = 响应事件
监视热键_信息 [i].直接触发 = 直接触发
.如果真 (监视热键_信息 [i].标识 ≠ 0)
返回 (监视热键_信息 [i].标识) ' 已经注册过的热键,返回热键标识
.如果真结束
监视热键_信息 [i].标识 = i + 1000000
返回 (监视热键_信息 [i].标识)
.如果真结束
.计次循环尾 ()
临时热键信息.事件子程序 = 响应事件
临时热键信息.普通键 = 键代码
临时热键信息.功能键 = 功能键状态
临时热键信息.其它键 = 其它键
临时热键信息.直接触发 = 直接触发
临时热键信息.标识 = 取数组成员数 (监视热键_信息) + 1000001
加入成员 (监视热键_信息, 临时热键信息)
.如果真 (临时热键信息.标识 = 1000001)
_创建定时器 (0, 16661, 选择 (周期 ≤ 0, 10, 周期), &监视热键线程)
.如果真结束
返回 (临时热键信息.标识)
.子程序 监视热键线程
.局部变量 asdf, 整数型, , , ?
.局部变量 i, 整数型
.局部变量 临时事件, 子程序指针
.局部变量 临时标识, 整数型
.局部变量 a
.局部变量 缓存键状态, 短整数型, , "256"
.计次循环首 (255, i)
缓存键状态 [i] = 251 ' 防检测处理
缓存键状态 [i] = _判断按键状态 (i)
.计次循环尾 ()
.计次循环首 (取数组成员数 (监视热键_信息), i)
.如果真 (监视热键_信息 [i].标识 ≠ 0)
a = 到字节 (取绝对值 (监视热键_信息 [i].普通键))
a = 缓存键状态 [a]
.判断开始 (a = 0) ' 0,无状态
.如果 (监视热键_信息 [i].键状态 = 1)
监视热键_信息 [i].键状态 = 2
.否则
监视热键_信息 [i].键状态 = 0
到循环尾 ()
.如果结束
.判断 (a < 0) ' -32767,按下状态
.如果真 (监视热键_信息 [i].键状态 = 0)
监视热键_信息 [i].键状态 = 1
.如果真结束
.如果真 (监视热键_信息 [i].普通键 < 0)
到循环尾 ()
.如果真结束
.默认
' 1,放开后状态,在不停判断按键状态中得不到放开状态了
.' 如果真 (监视热键_信息 [i].普通键 > 0)
' ' 监视热键_信息 [i].键状态 = 0
' 到循环尾 ()
.如果真结束
.判断结束
' 下面判断激活热键
.如果真 (监视热键_信息 [i].键状态 > 0 且 监视热键_信息 [i].键状态 ≠ 88)
监视热键_信息 [i].键状态 = 88
.如果真 (监视热键_信息 [i].功能键 = 选择 (缓存键状态 [18] < 0, 1, 0) + 选择 (缓存键状态 [17] < 0, 2, 0) + 选择 (缓存键状态 [16] < 0, 4, 0) + 选择 (缓存键状态 [91] < 0, 8, 0))
.如果真 (监视热键_信息 [i].其它键 ≠ 0)
a = 到字节 (取绝对值 (监视热键_信息 [i].其它键))
.如果真 (缓存键状态 [a] ≥ 0)
到循环尾 ()
.如果真结束
.如果真结束
临时事件 = 监视热键_信息 [i].事件子程序
临时标识 = 监视热键_信息 [i].标识
.如果 (监视热键_信息 [i].直接触发)
_回调钩子 (临时事件, 临时标识, 0, 0, 0)
.否则
_关闭对象 (_创建线程 (0, 0, 临时事件, 临时标识, 0, 0))
.如果结束
.如果真结束
.如果真结束
.如果真结束
.计次循环尾 ()
.子程序 取桌面任务栏高度, 整数型, 公开
.局部变量 矩形坐标, 精易_矩形
.如果 (_窗口取外边框 (_寻找顶级窗口2 (“Shell_TrayWnd”, 0), 矩形坐标))
返回 (矩形坐标.底边 - 矩形坐标.顶边) ' 这里成功的获取了任务栏高度
.否则
返回 (30) ' 防止某些垃圾机器没有任务栏,那真的见鬼了.
.如果结束