Autohotkey加速vscode与matlab连接

2022年10月6日17时10分更新

在 实际使用中发现了新的问题,决定把新的更新放到正文中来。有时候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)
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值