【第五章5.4】快捷键 -- 超级热键
找到超级热键库
Code aardioLine:155复制1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155.
//超级热键
import
win
.ui;/*DSG{{*/
var
winform =win
.form(text="超级热键演示"
;right=796
;bottom=434
;bgcolor=16777215
)- winform.add(
- edit={cls=
"edit"
;left=8
;top=8
;right=784
;bottom=360
;edge=1
;multiline=1
;z=1
};- editLog={cls=
"edit"
;left=9
;top=375
;right=784
;bottom=427
;bgcolor=16777215
;multiline=1
;z=2
}- )
/*}}*/
import
key.hotkey;var
superHotkey = key.hotkey(winform)//创建超级热键,必须用于窗口程序中
//批量加载热键配置表
- superHotkey.loadTable({
- (
function
(){//这里的代码可以直接执行
- })();
/* 大写金额(可输入数学表达式)、日期、时间 */
- [
"Ctrl+$"
] =function
(hFocus){win
.dlg.chineseNumber().show();- };
- });
import
win
.dlg.chineseNumber;- superHotkey.reg(
"CTRL"
,"K"
,function
(hwnd,...){- ..winex.say(
"你按了CTRL+K!"
)- }
- )
- superHotkey.reg(
"CTRL"
,"K"
,"K"
,function
(hwnd,...){- ..winex.say(
"你按了CTRL+K,K!"
)- }
- )
//添加新的热键方案
- superHotkey.reg(
"~"
,"H"
,"I"
,function
(hwnd,...){- ..winex.say(
"hello world!"
)- }
- )
//添加新的热键方案
import
fsys.lnk;import
process;- superHotkey.reg(
"SHIFT"
,"Q"
,"Q"
,function
(hwnd,...){var
path = fsys.lnk.search( {"qq.exe"
;"QQScLauncher.exe"
;"QQProtect.exe"
} ) ;- process.
execute
(path)- }
- )
- superHotkey.regStr(
"@SHIFT"
,function
(hwnd,...){- ..winex.say(
"单按 SHIFT"
)- }
- )
- superHotkey.regStr(
"~aa"
,function
(hwnd,...){- ..winex.say(
"http://www.aardio.com"
,hwnd)- }
- )
//允许在下面的事件中拦截所有按键,返回 true 阻止按键消息
- superHotkey.onKeyDown =
function
(vk){- }
- superHotkey.setEndKeys(
"SPACE"
)//可选指定下面的触发器函数, 当用户按下部分热键、并有一个或多个可能的候选键时触发
import
win
.util.tray;- superHotkey.onWaiting =
function
(hwnd,enteredKeys,waitingKeys){if
(!enteredKeys){- winform.editLog.text =
"准备就绪......"
;return
;- }
- winform.editLog.text =
'已按下:'
- + ..
string
.join(enteredKeys,"+"
)- +
' 等待候选键:'
- + ..
string
.join(waitingKeys,","
)- ,
"超级热键模式已启动"
- }
- winform.edit.text =
/*
热键 Ctrl+$ 用法:按下 Ctrl 不放,再按$
热键 Ctrl+K 用法:按下 Ctrl 不放,再按K, 然后都放开
热键 Ctrl+K,K 用法:按下Ctrl不放,再按2次K
热键 @Shift 用法:按下 Shift 再放开,中间不按其他键,通常不会阻止 Shift 切换输入法状态的默认热键。
热键 ~hi 用法:依次按键,每个键都放开
热键 Shift+Q,Q 用法:按下Shift不放,再按2下Q
热键 ~AA 用法:依次按键,每个键都放开
点这里,连续按上面各行的键。
注意这是超级热键,不是热字符串,以键为输入单位而不是字符。
例如 ~hi 只按3次键,第一个键不要按Shift + `
超级热键是操作系统级别的热键,系统全局可用。
超级热键的更多用法请参考开源软件 ImTip (http://imtip.aardio.com)
*/
/**details(超级热键规则)
一、超级热键检测规则
1、如果首个按下的键不是控制键,则不需要同时按住多个键。
如果按下的键是已注册的热键前半部分,则阻止当前按键继续发送。
如果继续按键已不符合任何热键,则释放已捕获的按键并按原顺序重新发送。
2、如果首次按住的是控制键( CTRL,ALT,SHIFT,WIN 之一),则必须同时按住多个键才算已完成热键。
如果这样同时按住的多个键是一个已完成的热键,但同时又是其他热键的前半部分,则必须放开所有键才会生效。
3、如果注册单个控制键热键,并且加上 @ 前缀,则放开该键(且中间没有按其他键)才算完成热键。
4、按键保持按下不放时不会触发多次超级热键。
超键热键中任何键名都只表示该键名所在的按键,不区分上档键。
例如热键 "~hi" 指连续按 3 个键,其中 ~ 不是指同时按 Shift + ` 。
二、示例
例如注册了以下 4 个热键,则使用规则如下:
热键 "~hi" 用法:按连续按 3 个键,每个键都要放开。
热键 "SHIFT+Q,Q" 用法:按下Shift不放,再按2下Q。
热键 "Ctrl+K" 用法:按下Ctrl不放,再按K, 然后都放开。
热键 "Ctrl+K,K" 用法:按下Ctrl不放,再按2次K(因为不是其他热键的前半部分,不需要等待放开)。
三、热键回调函数
热键回调函数返回 true 表示允许系统继续发送按键,
否则取消该按键,不再继续发送。
如果热键回调函数返回一个函数对象,
则取消该按键不再发送,并在返回函数以后异步执行返回的函数对象。
这样可以避免在热键回调函数中执行耗时操作。
超级热键基于低级键盘钩子,
在热键回调中不允许做耗时操作(在热键回调中返回异步执行的函数则不受限制),
如果耗时超过一秒或超过注册表限制的更小时间,系统会直接删除键盘钩子(导致热键不可用)。
没有任何方法可以检查到删除操作,应当遵守规则避免滥用。
如果仍然出现过一段时间键盘钩子失效。
建议检查一下是否安装了什么特别的软件导致了这样的问题。
end details**/
- winform.show();
win
.loopMessage();
相关回复
-
暂无评论!