一个实现特殊功能快捷键的方法总结
By
admin
at 2020-10-17 • 0人收藏 • 989人看过
这个特殊就特殊在我的使用功能上面:
需求介绍如下:
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我们就可以尽情的处理拦截到的消息了, 在执行里面进行各种需要的判断.
登录后方可回帖