一个实现特殊功能快捷键的方法总结
By
admin
at 2020-10-17 • 0人收藏 • 1132人看过
这个特殊就特殊在我的使用功能上面:
需求介绍如下:
1 , 假如有三个界面, mainform , winformA , winformB
2 , mainform里有个软件内全局快捷键 , winformA和winformB内分别有按键相同的快捷键,但是功能实现不同
3 , mainform界面里有个tabs选项卡控件 , custom控件里面加载winform
4 , 当切换到选项卡A ,显示winformA的时候, 快捷键功能要切换到A的, 依次类推B
这里的难点科恩那个就是在各个窗口的焦点问题了, 如果我每个窗口都定义一个快捷键列表, 那么有时候切换的时候并不能很好的切换过去, 由于是当你虽然打开了A界面, 但是点击了main中的其他按钮, 导致焦点从A转移...... 等等情况.
此时可以发现自带的win.ui.accelerator快捷键并不能很好的实现上面的功能.
那么为了不影响到电脑上其他软件的使用, 同时也不能使用系统热键hotkey , 剩下唯一的思路就是用key.hook了.
于是, 有了下面的代码
mainform.aardio中
import win.ui;
/*DSG{{*/
mainForm = win.form(text="aardio工程";right=787;bottom=450;bgcolor=6052956)
mainForm.add(
button={cls="button";text="Button";left=34;top=226;right=156;bottom=286;z=4};
custom={cls="custom";text="自定义控件";left=168;top=8;right=788;bottom=444;bgcolor=15780518;z=1};
plus={cls="plus";text="A卡";left=30;top=17;right=169;bottom=69;bgcolor=8421376;font=LOGFONT(h=-27);z=2};
plus2={cls="plus";text="B卡";left=30;top=78;right=169;bottom=130;bgcolor=8421376;font=LOGFONT(h=-27);z=3}
)
/*}}*/
import console
console.open()
import win.ui.tabs;
var tbs = win.ui.tabs(mainForm.plus,mainForm.plus2);
//tbs.container = mainForm.custom_up;
tbs.skin(
background={
default=0xFF008080;
hover=0xFFC0C0C0;
};
color={
default=0xFFFFFFFF;
hover=0xFF000043;
};
checked={
background={default=0xFFC0C0C0;
};color={default=0xFF000000}
}
)
tbs.loadForm(1,"\dlg\a.aardio");
tbs.loadForm(2,"\dlg\b.aardio");
tbs.selIndex = 1;
import key.hook;
hook = key.hook();
//录制回调函数
hook.proc = function(msg,vkcode,scancode,injected,flags,timeStamp,extraInfo){
if( injected ) return; //模拟鼠标不处理
if( win.getForeground() != mainForm.hwnd ) return false;
select(msg) {
case 0x100/*_WM_KEYDOWN*/ ,0x104/*_WM_SYSKEYDOWN*/ {
select(vkcode) {
case 0xD/*_VK_ENTER*/ {
if(tbs.selIndex == 1){
console.log("专属form1 的 _VK_ENTER")
}
}
case 0x25/*_VK_LEFT*/ {
console.log("全局的 _VK_LEFT")
}
else {
}
}
}
}
}
mainForm.show();
return win.loopMessage();用hook我们就可以尽情的处理拦截到的消息了, 在执行里面进行各种需要的判断.

登录后方可回帖