一个实现特殊功能快捷键的方法总结

By admin at 11 天前 • 0人收藏 • 88人看过

这个特殊就特殊在我的使用功能上面:

需求介绍如下:

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我们就可以尽情的处理拦截到的消息了, 在执行里面进行各种需要的判断.

GIF2.gif

aardio工程.zip


登录后方可回帖

登 录
信息栏
本站永久域名:HtmLayout.Cn
纯私人站,当笔记本用的,学到哪写到哪,目前在学aardio+halcon机器视觉.
Htmlayout界面在线学习文档
Sciter中文在线文档Sciter在线学习文档
本 站 主 站:Stm32cube中文网
Aardio 官方站:Aardio官方
Aardio最新功能:Aardio官方更新日志
aardio在线手册Aardio在线手册
C大Aardio论坛:Aar爱好者论坛
简码教程网:简码编程
AARDIO语言QQ群:70517368
赞助商:才仁机械
下载站:非凡软件站
Loading...