2022年10月6日17时06分更新
在 实际使用中发现了新的问题,决定把新的更新放到正文中来。有时候matlab脚本会打开figure,这个figure我们会懒得关闭,直接再次运行脚本,原来的脚本会找不到正确的窗口激活,重新加了一个判定。
原来的自定义函数在最后面脚本中,本次主要代码更新如下:
;-------------vscode中的matlab脚本快速使用打开的matlab窗口运行
#IfWinActive, ahk_exe Code.exe ;只在vscode中起作用
^!m::
Send, +!c ;复制文件完整路径
Sleep, 500
hyf_onekeyWindow("D:\MATLAB\R2021b\bin\matlab.exe","SunAwtFrame","\S")
Sleep, 500
WinGet, arr, List, ahk_class SunAwtFrame ;获得程序的exe应用列表,返回的是唯一ID
Loop,% arr ;创建列表内的循环
{
n := arr%A_Index%
WinGetTitle, titleLoop, Ahk_id %n%
If (titleLoop="MATLAB R2021b")
{
n1=%n% ; MsgBox, %n%,,,%n1% ;取出线程pid最后进行操作,防止窗口顺序冲突
}
Else
{
WinKill, Ahk_id %n%
}
}
Sleep, 200
WinActivate, Ahk_id %n1%
WinShow, Ahk_id %n1%
WinMaximize, Ahk_id %n1%
Sleep, 500
temp=%Clipboard%
StringLen, Length, temp ;整个文件字符串长度
mpos:=InStr(temp, ".m") ;.m position
if ((Length-mpos)==1)
{
Clipboard=run("%temp%")`n
MouseClick, Left, 900, 600 ;折腾乐半天也没有搞定根据控件激活窗口,这个左键点击是根据winspy获得的
Send, ^v
}
Else
{
MsgBox 不是matlab脚本!
}
Return
#IfWinActive ;结束约束
————————————————————————–
vscode有着丰富的代码补全方案,快速注释,代码块,快速删除等功能。
matlab本体有着无可替代的数据分析能力。
autohotkey有着超快的全局响应速度。
vscode中的插件安装不做赘述,网上一堆。
AHK环境的安装,直接官网安装v1版本就好了,不用特殊设置,一路安装即可。
借助AHK直接将vscode中编辑好的matlab到本体中运行,比vscode插件调用command window快太多了。真正实现了vscode脚本自由,以后类似的代码软件都可以这样操作了。
我自己使用的ahk脚本分享如下:
#SingleInstance, Force
SendMode Input
SetWorkingDir, %A_ScriptDir%
#If MouseIsOver("ahk_exe Code.exe") ;指定在zotero里面激活手
{
^!m::
;只在vscode中起作用
Send, +!c ;复制文件完整路径
Sleep, 100
hyf_onekeyWindow("D:\MATLAB\R2021b\bin\matlab.exe","SunAwtFrame","\S")
Sleep, 100
temp=%Clipboard%
Clipboard=run("%temp%")`n
Send, ^v
Return
}
hyf_onekeyWindow(exePath, titleClass := "", titleReg := "")
{ ;有些窗口用Ahk_exe exeName判断不准确,所以自定义个titleClass;https://www.autohotkey.com/docs/commands/SplitPath.htm
SplitPath, exePath, exeName, , , noExt
If !hyf_processExist(exeName)
{
;hyf_tooltip("启动中,请稍等...")
Run,% exePath
;打开后自动运行 TODO
funcName := noExt . "_runDo"
If IsFunc(funcName)
{
;hyf_tooltip("已自动执行函数:" . funcName)
Func(funcName).Call()
}
Else If titleClass
{
WinWait, Ahk_class %titleClass%, , 1
WinActivate Ahk_class %titleClass%
}
}
Else If WinActive("Ahk_exe " . exeName) ;有进程存在,最小化,鼠标活动窗口激活
{
funcName := noExt . "_hideDo"
If IsFunc(funcName)
Func(funcName).Call()
; WinHide
;WinSet, Bottom ;置于底层,但是没有最小化
WinMinimize
;激活鼠标所在窗口 TODO
MouseGetPos, , , idMouse
WinActivate Ahk_id %idMouse%
}
Else
{
If titleReg
titleClass := "Ahk_id " . hyf_getMainIDOfProcess(exeName, titleClass, titleReg)
Else If titleClass
titleClass := "Ahk_class " . titleClass
Else
titleClass := "Ahk_exe " . exeName
WinShow %titleClass%
WinActivate %titleClass%
funcName := noExt . "_activeDo"
If IsFunc(funcName)
{
;hyf_tooltip("已自动执行函数:" . funcName)
Func(funcName).Call()
}
WinMaximize
}
}
hyf_processExist(n) ;判断进程是否存在(返回PID)
{ ;n为进程名
Process, Exist, %n% ;比IfWinExist可靠
Return ErrorLevel
}
hyf_tooltip(str, t := 1, ExitScript := 0, x := "", y := "") ;提示t秒并自动消失
{
t *= 1000
ToolTip, %str%, %x%, %y%
SetTimer, hyf_removeToolTip, -%t%
If ExitScript
{
Gui, Destroy
Exit
}
}
hyf_getMainIDOfProcess(exeName, cls, titleReg := "") ;获取类似chrome等多进程的主程序ID
{
DetectHiddenWindows, On
WinGet, arr, List, Ahk_exe %exeName% ;获得程序的exe应用列表,返回的是唯一ID
Loop,% arr ;创建列表内的循环
{
n := arr%A_Index%
WinGetClass, classLoop, Ahk_id %n%
;MsgBox,% A_Index . "/" . arr . "`n" . classLoop . "`n" . cls
If (classLoop = cls)
{
If !StrLen(titleReg) ;不需要判断标题
Return n
WinGetTitle, titleLoop, Ahk_id %n%
;MsgBox,% A_Index . "/" . arr . "`n" . classLoop . "`n" . titleLoop
If (titleLoop ~= titleReg)
Return n
}
Continue
}
Return False
}
hyf_removeToolTip() ;清除ToolTip
{
ToolTip
}
MouseIsOver(WinTitle)
{
MouseGetPos,,, Win
return WinExist(WinTitle . " ahk_id " . Win)
}
进一步做了优化,添加了在vscode中运行约束,添加了matlab脚本识别,如果不是m脚本报错。我的命令行窗口在中间,添加了一个鼠标点击命令,保证命令行窗口激活。 ;————-vscode中的matlab脚本快速使用打开的matlab窗口运行 #IfWinActive, ahk_exe Code.exe ;只在vscode中起作用 ^!m:: Send, +!c ;复制文件完整路径 Sleep, 500 hyf_onekeyWindow(“D:MATLABR2021bbinmatlab.exe”,”SunAwtFrame”,”S”) WinMaximize,A ;窗口最大化,方便进行其他操作 Sleep, 500 temp=%Clipboard% StringLen, Length, temp ;整个文件字符串长度 ; MsgBox, The length of the string is %Length%. ; MsgBox % InStr(temp, “.m”) ; .m文件在的位置,如果是.m文件后面应该没有字母,两个数值相差1 mpos:=InStr(temp, “.m”) if ((Length-mpos)==1) { Clipboard=run(“%temp%”)`n MouseClick, Left, 900, 600 ;折腾乐半天也没有搞定根据控件激活窗口,这个左键点击是根据winspy获得的 Send, ^v } Else { MsgBox 不是matlab脚本! } Return #IfWinActive ;结束约束