zoukankan      html  css  js  c++  java
  • 自定义快捷命令程序(VC++加批处理)

    一 概述

    在看《从小工到专家-程序员修炼之道》时,看到建议使用Shell,很有感触。在很多时候,通过键盘操作,比鼠标的确会块很多,如果能用好shell命令(或批处理命令)   ,的确能节省我们很多的时候,特别是许多经常重复的工作。例如打开浏览器,进入csdn,cnblogs等感兴趣网站这样的工作,很多人会一天会重复许多次,每次重复这样的过程,单调且浪费不少时间,积少成多,浪费的时间很可观,其实可以使用命令行中,“浏览器.exe + 参数”的方式轻松的实现对兴趣网站的访问。其他的常用操作还有很多,例如“打开远程连接”,“通过VS2010打开自己最近在工作的项目”,“打开服务程序”,“打开常用文件夹”,使用自己常用的工具。

    二 问题

    如果都使用shell命令(或批处理命令),通过键盘进行这些操作,肯定会快的多。但是这些命令复杂而且不容易记住,怎么办?
    我简单的列举了一下使用命令会遇到的问题,并在后面一 一进行解决。
    1: 如何方便的打开命令行工具?如何轻松的实现输入命令?
    2: Shell命令(或批处理命令)这么复杂,不容易记住。
    3: 执行一个命令要输入太多代码,不比直接代开快。
    4: 是否可以很轻松的添加自己的命令

    三 使用场景

    根据自己的理解,我通过批处理实现了一个使用命令行快速执行命令的程序。
    我的程序叫XBAT,在开机时自动运行。XBAT的界面为一个可见的文本框,位于左面的右上角,占据很小的位置(见下图红色标出部分)。
    使用场景:
    1: 用户想用浏览器打开百度网站时,同时按下“Win + Z”键,XBAT文本框获得焦点
    2: 用户输入“bd”,按下Enter键。
    3: 浏览器打开百度站点。
     
    现在这个程序我自己用起来得心应手,没有这个程序,我感觉很不方便。
    我现在常用的是用它来打开iis,打开“服务”,打开“DEPENDS.EXE”,打开自己常用的文件夹,常用的sln,打开命令行,打开常用站点,常用文件夹。

    四 实现

    使用就是这样简单。
    实现也不复杂。
    1:XBAT中,捕获“Win + Z”快捷键,不管你在干什么,知道按下这组快捷键,就会将焦点设置到XBAT的文本框中。MFC的实现代码为:
    static const long g_HotKeyCMD = WM_USER + 1;
    ::RegisterHotKey(this->m_hWnd, ::g_HotKeyCMD, MOD_WIN, 'Z');
    BEGIN_MESSAGE_MAP(CXBATDlg, CDialog)
    ON_MESSAGE(WM_HOTKEY, OnHotKay)
    ...
    END_MESSAGE_MAP()
    LRESULT CXBATDlg::OnHotKay(WPARAM wParam, LPARAM pParam)
    {
        if (wParam == ::g_HotKeyCMD)
        {
            // ...
            return 0;
        }
        //...
        return 0;
    }

    2: 用户输入命令,按下Enter键后,XBAT会以用户输入命令为参数调用一个批处理run.bat
     
    BOOL CXBATDlg::PreTranslateMessage(MSG* pMsg)
    {
        this->UpdateData();
        if(pMsg->wParam == VK_RETURN)
        {
            static CString batPath = "";
            if (batPath == "")
            {
                CString strAppPath;
                CXBATDlg::GetAppPath(strAppPath);
                batPath = strAppPath + "MyBAT\run.bat";
            }
            ::ShellExecute(this->m_hWnd, "open", batPath, 
                this->m_CMD.GetBuffer(), NULL, SW_HIDE);
            this->m_CMD = "";
            this->UpdateData(FALSE);
            return true; 
        }
        return  CDialog::PreTranslateMessage(pMsg);
    }

    代码中的m_CMD为空户输入的命令
    3: run.bat的工作原理:
    run.bat会根据用户输入的bd,知道是要访问百度网站,就找到浏览器的exe文件,以百度地址为参数,调用浏览器命令,实现打开网站的操作。
    if %1==bd (
        start /max "C:...360se.exe" "www.baidu.com"
    )
    4: 对run.bat进行重构
    1) 我们需要打开的站点有很多,所以需要将打开浏览器的代码抽象出来,我的做法是把这些批处理放置到单独的文件“openurl.bat”中。
    代码成了
    if %1==bd (
    call openurl "www.baidu.com"
    )
    2) 将要打开的网站和类似的“bd”命令放置到一个文件中单独配置,这个文件叫“store.txt”。
    除了能打开网站以外,还需要能打开一些exe文件,打开文件夹,打开VS的sln。也就是说要针对多种操作类型,需要对操作类型进行定义:
    s: 打开sln(使用vs2010,提供一个opensln.bat批处理,里面代码:
    start "C:...VSLauncher.exe" "%1"
    u: 打开网站(使用浏览器,使用openurl批处理,里面就一行代码:
    start /max "C:...360se.exe" %1
     
    o: 对象文件,直接执行(提供一个openexe.bat批处理,里面就一行代码:
    start "" %1
     
    f: 打开文件夹(提供一个openfolder.bat批处理,里面就一行代码:
    start %1
    后来有添加了打开pdf什么的。
     
    run.bat的批处理就需要修改为:
     
    set found=0
    @echo off&setlocal enabledelayedexpansion 
    for /f "tokens=1,2,3 delims= " %%i in (store.txt) do (
        if %%i==%1 ( 
            set p=%%j&set p1=!p:#p#=%path%!&set p2=!p1:#f#=%folder%!&set p3=!p2:#s#=%SystemRoot%!
            if %%k==s (
                call opensln !p3!
            )
            if %%k==f (
                call openfolder !p3!
            )
            if %%k==u (
                call openurl !p3!
            )
            if %%k==o (
                call openexe !p3!
            )
            echo 找到选项 %%k
            set found=1
        )
    )

    store.txt的内容如下:
    kfgj E:开发工具 f
    gjrj E:工具软件 f
    dzs E:电子书 f
    bd www.baidu.com u
    cbs http://www.cnblogs.com u
    csdn www.csdn.net u
    a http://localhost/admin u
    h http://localhost/ u
    126 www.126.com u
    wk http://wenku.baidu.com u
    rz F:.../...xls o
    ss F:........sln s
     
    说到这儿,就有一个我头疼的问题,在store.txt中,我无法在诸如“:开发工具”中包含空格,不知道有没有人知道怎么处理?
     
    在run.bat中,还有一些操作不能包括在这几种操作中,只好单独处理了,特别是带参数的。(javascript中有REPL,不知道批处理中是否也可以这样,如果可以,就能防止在store.txt中了)
     
    if %found%==1 (
        goto start
    )
    if %1==iisreset (
        start iisreset
        goto start
    )
    if %1==iis (
        start C:WINDOWSsystem32inetsrviis.msc
        goto start
    )
    if %1==fw  (
        start %SystemRoot%system32services.msc /s
        goto start
    )
    if %1==yc  (
        start %SystemRoot%system32mstsc.exe
        goto start
    )
    if %1==jsq (
        start %SystemRoot%system32calc.exe
        goto start
    )

     

    五 结束

    除了这些功能外,我还添加了按“win+C”打开“store.txt”文件,按“Win+V”打开XBAT的文件夹。
    XBAT的不足有:
    1: 虽然软件界面很小,但是还是存在,而且是在界面的顶层,特别是播放视频的时候,看着不舒服。
    2: 在store的文件夹等路径中,不能包含空格。
    3: 有时候会被360认为有危险。
    4: 添加新的命令不方便,需要打开store.txt自己动手添加
    5: 暂时XBAT只接受简单的指令,无法输入带参数的指令,例如查找文件等
     
    源代码下载地址:
    http://download.csdn.net/detail/xumingxsh/7801215
    Release版下载地址:
    http://download.csdn.net/detail/xumingxsh/7801733
  • 相关阅读:
    使用Jmeter测试java请求
    如何高效开发jmeter自定义函数
    使用Fiddler进行抓包
    使用Jmeter导出导入接口自动化案例中的自定义变量
    使用Jmeter录制脚本并调试
    python练习——第3题
    python练习——第2题
    python练习——第1题
    python练习——第0题
    python机器学习——逻辑回归
  • 原文地址:https://www.cnblogs.com/Rong-/p/3929791.html
Copyright © 2011-2022 走看看