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

By admin at 2020-10-17 • 0人收藏 • 1020人看过

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

需求介绍如下:

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


登录后方可回帖

登 录
信息栏
 私人小站

本站域名

ChengXu.XYZ

投诉联系:  popdes@126.com



快速上位机开发学习,本站主要记录了学习过程中遇到的问题和解决办法及上位机代码分享

这里主要专注于学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.
如果侵权,联系 Popdes@126.com

友情链接
Aardio官方
Aardio资源网


才仁机械


网站地图SiteMap

Loading...