自定义快捷命令程序(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 找到选项 %%kset 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 iisresetgoto start
)
if %1==iis (start C:\WINDOWS\system32\inetsrv\iis.mscgoto start
)
if %1==fw  (start %SystemRoot%\system32\services.msc /sgoto start
)
if %1==yc  (start %SystemRoot%\system32\mstsc.exegoto start
)
if %1==jsq (start %SystemRoot%\system32\calc.exegoto 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

转载于:https://www.cnblogs.com/Rong-/p/3929791.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/273617.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis 快速入门

简介 Redis 是一个 Key-Value 存储系统。和 Memcached 类似,它支持存储的 value 类型相对更多,包括 string(字符串)、 list(链表)、 set(集合)和 zset(有序集合)。这些数据类型都支持 push/pop、add/remove 及取交集并集和差集及更丰富的操作&#xff0c…

7. Adapter

转载于:https://www.cnblogs.com/anit/p/3930202.html

Redis 中常用命令

Redis 中常用命令 keys 返回满足给定 pattern 的所有 key。 127.0.0.1:6379> keys *1) "name2"2) "myzset"3) "myset7"4) "name"5) "myset6"6) "mylist"7) "mylist2"8) "myset3"9) "…

CGI与Servlet的区别和联系

1. 定义: CGI(Common Gateway Interface 公共网关接口)是HTTP服务器与你的或其它机器上的程序进行“交谈”的一种工具,其程序须运行在网络服务器上。 2. 功能: 绝大多数的CGI程序被用来解释处理杰自表单的输入信息,并在服 务器产生…

Redis sorted set 类型操作及常用命令

七个原则 Redis 是一个操作数据结构的语言工具,它提供基于 TCP 的协议以操作丰富的数据结构。在 Redis 中,数据结构这个词的意义不仅表示在某种数据结构上的操作,更包括了结构本身及这些操作的时间空间复杂度。Redis 定位于一个内存数据库&am…

Gradle中的buildScript代码块

在编写Gradle脚本的时候,在build.gradle文件中经常看到这样的代码: build.gradle1 2 3 4 5 6 7 8 9 buildScript {repositories {mavenCentral() } }repositories {mavenCentral() }这样子很容易让人奇怪,为什么repositories要声明两次哪&…

Redis List 类型操作及常用命令

七个原则 Redis 是一个操作数据结构的语言工具,它提供基于 TCP 的协议以操作丰富的数据结构。在 Redis 中,数据结构这个词的意义不仅表示在某种数据结构上的操作,更包括了结构本身及这些操作的时间空间复杂度。Redis 定位于一个内存数据库&am…

Hibernate查询之Criteria查询

转自:http://www.cnblogs.com/Laupaul/archive/2012/02/15/2353194.html Criteria是一种比hql更面向对象的查询方式。Criteria 可使用 Criterion 和 Projection 设置查询条件。可以设置 FetchMode( 联合查询抓取的模式 ) ,设置排序方式,Crite…

IntelliJ Idea 常用插件

必备插件 Lombok 使用此插件可以使得我们的代码简洁,不用去写很多的set/get方法。使用之前需要引入 lombok 插件依赖。 JsonFormat 基于GsonFormat。快速将JSON字符串转换为实体类。它支持Jackson注释。 MyBatis Log Plugin 将 SQL 直接打印在控制台,不用…

jQuery 学习笔记(jQuery: The Return Flight)

第一课. ajax:$.ajax(url[, settings]) 练习代码: $(document).ready(function() {$("#tour").on("click", "button", function() {$.ajax(/photos.html, {success: function(response) {$(.photos).html(response).fadeI…

Redis Hash 类型操作及常用命令

七个原则 Redis 是一个操作数据结构的语言工具,它提供基于 TCP 的协议以操作丰富的数据结构。在 Redis 中,数据结构这个词的意义不仅表示在某种数据结构上的操作,更包括了结构本身及这些操作的时间空间复杂度。Redis 定位于一个内存数据库&am…

Redis set 类型操作及常用命令

七个原则 Redis 是一个操作数据结构的语言工具,它提供基于 TCP 的协议以操作丰富的数据结构。在 Redis 中,数据结构这个词的意义不仅表示在某种数据结构上的操作,更包括了结构本身及这些操作的时间空间复杂度。Redis 定位于一个内存数据库&am…

缓存初解(五)---SpringMVC基于注解的缓存配置--web应用实例

之前为大家介绍了如何使用spring注解来进行缓存配置 (EHCache 和 OSCache)的简单的例子,详见 Spring基于注解的缓存配置--EHCache AND OSCache 现在介绍一下如何在基于注解springMVC的web应用中使用注解缓存,其实很简单&#xff0…

Redis String 类型操作及常用命令

七个原则 Redis 是一个操作数据结构的语言工具,它提供基于 TCP 的协议以操作丰富的数据结构。在 Redis 中,数据结构这个词的意义不仅表示在某种数据结构上的操作,更包括了结构本身及这些操作的时间空间复杂度。Redis 定位于一个内存数据库&am…

于我,过去,现在和未来 —— 西格里夫·萨松

In me, past, present, future meet            于我,过去、现在和未来To hold long chiding conference              商讨聚会 各执一词 纷扰不息My lusts usurp the present tense             林林总总的 欲望,…

Java assert关键字

Java assert关键字 Assert 简介 Java2在1.4中新增了一个关键字:assert。在程序开发过程中使用它创建一个断言(assertion)。语法格式有两种: assert condition; 这里condition是一个必须为真(true)的表达式。如果表达式的结果为true,那么断言为…

linux 二级域名设置

首先,你的拥有一个有泛域名解析的顶级域名,例如: domain.com  其次,在 httpd.conf 中打开 mod_rewrite  之后,在 httpd.conf 的最后,添加以下内容:  RewriteEngine on  RewriteMap lowe…

Spring Boot @Conditional 注解

Spring Boot Conditional注解 Conditional是Spring4新提供的注解,它的作用是按照一定的条件进行判断,满足条件的才给容器注册Bean。 Conditional注解定义 Target({ElementType.TYPE, ElementType.METHOD}) Retention(RetentionPolicy.RUNTIME) Documente…

计算几何 半平面交

LA 4992 && hdu 3761 Jungle Outpost 杭电的有点坑啊。。一直爆内存,后来发现大白的半平面交模板那里 point *p new point[n]; line *q new line[n]这里出了问题,应该是在函数里面申请不了比较大的数组,所以爆内存。。我在全局定义…

Maven 强制导入jar包

场景 有时候因为各种原因(依赖有了,jar包有了),项目中就是没有这个jar包。 在需要强导的项目中创建lib文件夹,将需要强导的jar包访问lib中。添加依赖${pom.basedir}:获取当前所在的项目目录 ${pom.basedir&…