切换输入法的Ctrl+空格
本帖最后由 /db_自贡黄明儒_ 于 2016-9-6 16:32 编辑wscript.shell大有可为
objwsh.SendKeys strRead '向当前活动窗口发送按键
'下面是操作键的发送代码
退格键 {BACKSPACE}、{BS} 或 {BKSP}
BREAK {BREAK}
CAPS LOCK {CAPSLOCK}
DEL 或 DELETE {DELETE} 或 {DEL}
向下键 {DOWN}
END {END}
ENTER {ENTER} 或 ~
ESC {ESC}
HELP {HELP}
HOME {HOME}
INS 或 INSERT {INSERT} 或 {INS}
向左键 {LEFT}
NUM LOCK {NUMLOCK}
PAGE DOWN {PGDN}
PAGE UP {PGUP}
向右键 {RIGHT}
SCROLL LOCK {SCROLLLOCK}
TAB {TAB}
向上键 {UP}
F1 至 F12 {F1} 至 {F12}
SHIFT +
CTRL ^
ALT %
+ { 等修饰符 {+} {{} {^} {}} {%}
'如果在按 e 和 c 的同时按 SHIFT 键,则发送字符串参数 +(ec)
'可发送一个键的重复键击。如10次x,为{x 10},但不可发送10次组合键,如Ctrl+x
'不能发送 PRINT SCREEN 键 {PRTSC}
'常用 Wscript.Sleep 来延时若干毫秒发送按键,避免程序来不及响应
(defun sendkeys(keys)
(or *WSH* (setq *WSH* (vlax-get-or-create-object "wscript.shell")))
(vlax-invoke-method *WSH* 'sendkeys keys)
(princ)
)
本帖最后由 /db_自贡黄明儒_ 于 2016-9-6 16:29 编辑
哦,原来是这样的
**** Hidden Message *****中英文输入自动切换,有些高手写了这个程序,但是要先进行设置,这很不爽。我们可以向键盘发送ctrl+空格来切换,剩下的问题就是如何判断是否在中文(或者英文)状态下。先发送一个字母,根据返回结果来判断?
SENDKEY,曾经用过,但不明其理,黄大侠的文章也许对我有帮助 原来是怎么样的呢{:1_9:} 看看黄大师最近的作品 按高飞鸟大师的DynamicWrapperX注册后,终于可以关闭中文输入法了{:1_12:}
;;不论CapsLock是否锁定,小写返回0,大写1
;;&H14 十六进制;20十进制
(DEFUN CapsLock ()
;;(setq :VK_CAPITAL 20)
(setq *wrap* (vlax-create-object "DynamicWrapperX"))
(vlax-invoke *wrap* 'Register "user32" "GetKeyState" "i=l" "r=l")
(vlax-invoke *wrap* 'GetKeyState 20);同(vlax-invoke wrap 'GetKeyState &H14)
)
;;;GetKeyboardLayout(0) '134481924英文
;;;返回T 为英文状态
(DEFUN IMSEnglish ()
(setq *wrap* (vlax-create-object "DynamicWrapperX"))
(vlax-invoke *wrap* 'Register "user32" "GetKeyboardLayout" "i=l" "r=l")
(= (vlax-invoke *wrap* 'GetKeyboardLayout 0) 134481924)
)
**** Hidden Message ***** (setq :VK_CAPITAL 20) ;0x14
(setq $DWrapX (vlax-create-object "DynamicWrapperX"))
(if $DWrapX
(progn
;(vlax-invoke $DWrapX 'Register "user32.dll" "keybd_event" "i=bbll" "r=l") ;注册keybd_event函数:模拟键盘事件
;(vlax-invoke $DWrapX 'Register "user32.dll" "MapVirtualKey" "i=uu" "r=u") ;注册MapVirtualKey函数:获取键盘映射
(vlax-invoke $DWrapX 'Register "user32.dll" "GetKeyState" "i=l" "r=n") ;注册GetKeyState函数:获取键状态
;(vlax-invoke $DWrapX 'Register "kernel32.dll" "Sleep" "i=d" "r=n") ;
)
)
;输入命令
(defun EF_SendKeys (sKeys / obj)
(setq obj (vlax-create-object "WScript.Shell"))
(vlax-invoke-method obj 'SendKeys sKeys)
(vlax-release-object obj)
)
;执行
(defun EF_AutoCapsLock:ON()
(if $EF_AutoCapsLock:Debug (princ (strcat "\n")))
(if (/= (vlax-invoke $DWrapX 'GetKeyState :VK_CAPITAL) 1)
(EF:SendKeys "{CAPSLOCK}")
)
)
(defun EF_AutoCapsLock:OFF()
(if $EF_AutoCapsLock:Debug (princ (strcat "\n")))
(if (/= (vlax-invoke $DWrapX 'GetKeyState :VK_CAPITAL) 0)
(EF:SendKeys "{CAPSLOCK}")
)
)
本帖最后由 /db_自贡黄明儒_ 于 2016-12-7 14:44 编辑
elitefish 发表于 2016-12-7 12:23
我觉得AutoCad是用来画图的,所以很少关心处理文字。
但是在处理明细表时,得输入汉字。于是不断输入ed,处理明细;输入ed,处理明细...
可是再次输入ED是,忘了要切换输入法,结果一看是汉字,只好关闭重新输入。有一天,终于烦了,
于是我想,鼠标在命令栏,“输入法”总是英文多好。
最先看到的是elitefish大师的中英切换,便是感觉设置比较麻烦
经过多方尝试,终于可以实现。下面简单的代码在08、16下就可以实现(但在05(EN)未成功)。这毕竟是好的开头。
虽然08、16下实现了,但如果中文状态,总是会被关闭。同我的想像还是有点距离。
如果05(en)下要成功,还得注册高飞鸟大师发了DynamicWrapperX
(VLR-editor-Reactor
nil
'((:vlr-commandEnded . command-will-start))
)
(defun command-will-start (reactor command-list)
(vl-vbarun "KeyStatesCAPITAL")
)
;;KeyStatesCAPITAL上在KeyStatesCapital.dvb中定义的,当然你得先加载它,其源码如下
;;;Public Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
;;;Public Sub KeyStatesCAPITAL()
;;; Set WshShell = CreateObject("wscript.shell")
;;; If GetKeyState(&H14) = 1 Then WshShell.SendKeys "{CAPSLOCK}"
;;;End Sub
好东西,谢谢分享
回帖 我 看看看 我来测试一下,行不行”
看看研究成果
这种东西lisp不好处理,arx很方便,c#也可以,不过碰到win10+ 搜狗输入法,奇形怪状的输入法就要另外处理 看看,学习一下