同时接两个键盘,一个键盘是英文输入法,一个键盘是中文输入法,可以吗?

突然发现,其实如果用autohotkey来写代码的话,连切换输入法都不需要了!

autohotkey的send公式有个{text}模式,可以无视当前输入法,直接输出英文字符,完全按照字符去输出。

所以只需要以下非常简短的代码,就可以更优雅高效地搞定了

#SingleInstance force
#Persistent
#include Lib\AutoHotInterception.ahk

AHI := new AutoHotInterception()
keyboardId := AHI.GetKeyboardId(0x0433, 0x0004)
AHI.SubscribeKeyboard(keyboardId, true, Func("KeyEven"))

return

KeyEven(code, state){
    If (state==1)
    {
	st = %code%
	scnum := Format("{:03X}", st)
	st = SC%scnum%
	name:= GetKeyName(st)
	SendInput,  {text}%name%
    }
}

不过这个只针对数字键、小写字母、英文符号可用,大写字母和功能键需要另外写if语句,效果如图:

快

功能键被按照键名输出了

1 个赞

这个代码更快啊。不过空格需要特别处理一下 :)其他的键可以不管它,用另一个键盘来输入。

不知道是不是变量范围的问题,这个特殊键已经转换了,但是字母没输出

If (state==1)
	{
		st = %code%
		scnum := Format("{:03X}", st)
		st = SC%scnum%
		name:= GetKeyName(st)
		array1 := ["Space", "Tab", "CapsLock","LShift","LControl","LAlt","Backspace","NumpadEnter","RShift","RControl","RAlt"]
		haveout=False
		for index, element in array1
		{
			if(name == element){
				haveout=true
				send,^+1
				sleep,100
				sttttt =%code% 
				sttttt := Format("{:03X}", sttttt) 
				SendInput, {SC%sttttt%}
				send,^+2 
			}
		}
		if(haveout){
		;SendInput,  {text}%name%
		}
		else{
			SendInput,  {text}%name%
		}
	}

英文键盘特殊键起作用的:

If (state==1)
	{
		st = %code%
		scnum := Format("{:03X}", st)
		st = SC%scnum%
		name:= GetKeyName(st)
		array1 := ["Space", "Tab", "CapsLock","LShift","LControl","LAlt","Backspace","NumpadEnter","RShift","RControl","RAlt"]
		global haveout=False
		for index, element in array1
		{
			if(name == element){
				haveout=true
				send,^+1
				sleep,100
				sttttt =%code% 
				sttttt := Format("{:03X}", sttttt) 
				SendInput, {SC%sttttt%}
				send,^+2 
			}
		}
		if(haveout){
		;SendInput,  {text}%name%
		}
		else{
			SendInput,  {text}%name%
			haveout=False
		}
	}

实际使用一段时间后的反馈:确实方便了些(尤其是在输入验证码的时候),不过桌子摆两个键盘,操作上并不是很方便…占地方也容易误碰?

有些键盘按键比较少,能省地方

看到这种

对,Diy机械键盘,貌似是个大坑,能玩好久

可自己设计,也可以用别人开源的键盘

图中这个键盘的底座就是3D打印出来的

哈哈哈,复杂了。