aardio 调用 AHK 实现超极热键

By 圣地 at 2021-12-12 • 0人收藏 • 284人看过
import win.ui;
/*DSG{{*/
var winform = win.form(text="嵌入autohotkey演示";right=599;bottom=399)
winform.add()
/*}}*/
import ahk; 
var code =`
#Persistent ;保持ahk线程不退出
#NoTrayIcon ;不显示托盘图标
#include <aardio>  ;启动ahk代码中必须加入这句才能与aardio交互
;LWin:: msgbox, 我屏蔽国 Win 键
#E:: msgbox, 我屏蔽了WIN+E
`
//直接定义允许AHK调用的aardio函数(函数名以on开头)
var script = ""
for(i=1;9;1){
	ahk["onFunc"++i] = function(){
		winform.msgbox(i)
	}
	script += "#" ++ i + "::" ++ "aardio.onFunc" ++ i ++ "()"+ '\n'
}
code += script
//运行ahk代码
ahk.run( code );
winform.show();
win.loopMessage();

以前接触过AHK,习惯了它的按键方式,再使用(key.hotkey)超极热键感觉不习惯

比如定义按键后调用也必须按定义时顺序 来按下,

幸好 aardio 支持调用众多种其它编程语言,其中就有 AutoHotkey

上面代码演示了在ahk定义热键来调用 aardio中定义的函数。是不是很好玩~~~

 

image.png

5 个回复 | 最后更新于 2021-12-13
2021-12-13   #1

aardio 的热键是全世界通用的规则 —— 不会让你不习惯吧?!

如果你说的是 AHK 自己发明的规则,aardio 可能是所有编程语言唯一自带实现了最接近 AHK 规则的超级热键。如果这让你困扰,那么非常抱歉。


aardio 里的「超级热键」 —— 类似于 AHK 的「热字符串」,

AHK 的热字符串同样要求按时序按键(且不会屏蔽按键)。要求这种东西不要求顺序,就好像要求轮船不能在水上跑,aardio 做不到,AHK 同样做不到。

至于你上面用 AHK 写的热键,

你看起来很习惯按设计的先后顺序按键,从来没试过按 E + WIN 对吧?!

另外你为什么注释掉一个热键,因为你AHK 里这2个热键 WIN + E, WIN 相互冲突吗?!

超级热键就没这个问题。


当你在要求一方面的完美时,就会带来另一方面的缺陷。

例如:如果你要求 Ctrl + Shift + E 等价于 Shift + Ctrl + E,

那么从另一方面看他就是缺陷,因为这样做就只能看起来满足了你一时的想法,

反过来如果需要区分这2个键,就不可能实现了。


但别人只要让 Ctrl + Shift + E,Shift + Ctrl + E 触发同一个回调就可以更完美。


2021-12-13   #2

多谢指导,主要是不熟悉,如果键盘钩子方式能保证稳定运行,超极热键这也是一个不错的定义热键方法比 RegisterHotKey 强一些(但 RegisterHotKey也最稳定) 。

刚又学习了下超极热键,简单总结了下使用规则。


ahk快捷键和aardio超极热键的规则: 


1、以 Win+E 为例 

  AHK 可以在按下 Win+E 时触发自己定义功能,同时屏蔽系统 Win+E 功能

  aardio 也可以在按下 Win+E 时触发,同时屏蔽系统Win+D功能,既Win+其它键 AHK 和 aardio 都可以屏蔽系统定义的相同热键。

  但 AHK 还可以在 WIN 按下保持不动时一直来回按 E 多次触发,aardio 则不可以只能先按WIN再按 E 触发, 两个修饰键 + 一个字母键也是一样。



2、以 Win 为例

  AHK 可以直接用 LWIN:: msgbox,123 来定义单独一个WIN的热键,且会屏蔽系统WIN键打开开始菜单的功能

  aardio 也可以用 LWIN 或 WIN 定义单独一个 WIN 的热键调用,但其不会屏蔽系统 WIN 键功能。


 

3、以同时定义 WIN 热键和 WIN+E 热键为例

  AHK: LWin:: msgbox, 我屏蔽国 Win 键

       #E:: msgbox, 我屏蔽了WIN+E

       这会屏蔽系统 Win 打开开始菜单功能,但这样只会 WIN 定义热键有效,WIN+E 或其它和 WIN组合热键都会无效。


  aardio: 

      同样则 WIN 热键和 Win+E 热键都会有效,系统本身 Win打开开始菜单功能也会有效。

      这里可以用 AHK 定义一个 LWIN::return  , 然后用 aardio 定义 WIN 和 Win+E 等,则既可以屏蔽系统 Win功能也或以使这两键都可用。

      还有一个方法用组策略可以屏蔽系统 Win的功能。



4、以 Ctrl+Win+E 为例

  AHK 可以按下Ctrl+Win+E 来触发,也可以按下 Win+Ctrl+E 来触发,也就是除了字母键外其它的修饰键可以互换顺序

  aardio 定义了 Ctrl+Win+E 则只能按定义顺序来触发,不过也再定义一个 Win+Ctrl+E 来触发同一个函数。


2021-12-13   #3

「超级热键」应当跟 AHK 的「热字符串」对比。

AHK 的热键,应当跟 aardio 的普通热键功能对比。 

2021-12-13   #4

「超级热键」最基本的功能,下面上代码演示:

1、依次按 `aa 会触发热键输出指定的字符串,要求不提前输入任何字符,不模拟按退格键,开中文输入法不影响 —— AHK 全部不支持,请问你怎么实现?!

2、要求定义 CTRL, CTRL + SHIFT, SHIFT + CTRL 三个热键,相互不冲突,而且还不影响系统的其他热键,例如 CTRL + A 可以正常使用,CTRL,SHIFT 两个键可以组合出一堆热键 —— 这些酸爽的功能,AHK 全部不支持,请问你怎么实现?!

这是「超级热键」两个最基本、最重要的特性,也是与普通热键唯一的区别。
据我所知 AHK 实现不了超级热键的任何功能 —— 当然我对 AHK 确实不熟,来,你上你上,你教教我到底怎么「用 AHK 实现超级热键

2021-12-13   #5
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
import win.ui;
/*DSG{{*/
var winform = win.form(text="超级热键演示";right=675;bottom=337;bgcolor=16777215)
/*}}*/
 
import key.hotkey; 
var hotkey = key.hotkey(winform) 
 
hotkey.reg(
    "CTRL", 
    function(hwnd,...){
        ..winex.say("你按了CTRL")
    } 
)
 
hotkey.regStr(
    "CTRL+SHIFT",
    function(hwnd,...){ 
        ..winex.say("你按了CTRL+SHIFT")    
    } 
)
 
hotkey.regStr(
    "SHIFT+CTRL",
    function(hwnd,...){ 
        ..winex.say("你按了SHIFT+CTRL")    
    } 
)
 
hotkey.regStr(
    "~aa",
    function(hwnd,...){ 
        ..winex.say("http://www.aardio.com",hwnd)
    } 
)
 
winform.show() 
win.loopMessage();

如果你的需求就是干掉「超级热键」的功能,那「超级热键」确实做不到。

登录后方可回帖

登 录
信息栏
本站永久域名:HtmLayout.Cn
aardio可以快速开发上位机,本站主要记录了学习过程中遇到的问题和解决办法及aardio代码分享

这里主要专注于aardio学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.

AARDIO语言QQ群:70517368
Aardio 官方站:Aardio官方
Aardio最新功能:Aardio官方更新日志
C大Aardio论坛:Aar爱好者论坛
本 站 主 站:Stm32cube中文网
Sciter中文在线文档Sciter在线学习文档
赞助商:才仁机械
Loading...