朋友,可曾想过把所有的事情都放到一个TextBox里面去做?今天我就做了一个,理论上可以干任何事情的TextBox。嘿嘿。
实习的日子实在是挺忙,CNScript还停留在语法分析的阶段,一直没时间去打开那个大工程(其实是有时间的,可惜零碎的时间都被我拿来写这篇文章要讲的这些小东西了)。
我们在浏览网页时,或许会突然想打开某个程序,比如计算器,算点东西;又可能想打开Photoshop,处理一下网页上的某个图片;又可能想打开记事本,摘抄一些文字。这时我们不得不回到桌面,或者打开那个硕大的开始菜单,在程序里面去找我们想要的东西。
有的时候,我们还会重复做一些机械的动作,比如读一个文件,检查是否有变动,比如检查某个文件夹,看是否有新文件。当然,你可以写一个程序来完成这个操作,但是有时候这种操作你觉得最多就重复个两三次,你不会愿意去打开Visual Studio创建一个工程。
归结本质,我们就是想要一个随叫随到的,可以有一定能力帮我们做事情的东西。但是如果这个东西太大,会挡住我们正在浏览的网页或者正在处理的文档,那就不好了。所以我就想到了一个Topmost的TextBox,放在屏幕的顶端,也就是一般窗口的标题栏那里,这样子不会挡住你要做的事情,而且在需要的时候 只要鼠标一移过去就可以用了。
OK,有了这样一个TextBox,“随叫随到”已经完成了。但是我们需要这个TextBox有一定能力,比如我想运行一个程序,它能帮我运行,我想搜索一个词语,他能帮我搜索,我想打开一个URL,他能帮我打开,我想计算一个表达式,他能帮我计算。但是人的需求是无限的,我们随时会有新的需要,他不可能拥有所有的功能,那么如何让他有能力做到任何事情呢?我们需要一种很强悍的可扩展性。玩过魔兽世界的朋友们一定知道,魔兽世界提供一个插件机制,玩家可以为游戏写插件,来丰富游戏的功能,现在已经有千千万万的魔兽世界插件在各大网站上提供下载了,正是因为如此,魔兽世界才拥有着这么强的可扩展性。所以,我们这个TextBox也要用插件机制来驱动。在C#的Microsoft.CSharp名字空间中有一个C#的编译器,可以将C#代码编译成托管组件,直接生成在内存中,以反射的方式来运行,这个机制为我们快速实现一个插件系统提供了可能。因此我选用了.net framework 3.5,用Windows Presentation Foundation来做界面,用C#来当我的脚本语言。
俗话说,一不做,二不休,既然提供了插件,那我主程序除了运行插件以外就什么都不做了。运行了插件之后,将界面所有控件的控制权都交给插件,插件爱干啥就干啥去。主程序就是一个Window,Window上是一个StackPanel,Panel里面是一个TextBox,仅此而已。当然,插件可以向StackPanel里面加东西,以丰富这个条条的外观内容。
可执行程序的环境如下所示:(BoxSharp是这个程序的名字)
其中BoxSharpCore,BoxSharpRunPath,BoxSharpScripting,BoxSharpSearch是我刚写好的几个插件。
BoxSharpCore插件提供了最基本的/exit命令,用于退出程序。此插件还控制了一些外观方面的细节,包括自动记住TextBox上次退出时的位置,大小,用于下次启动时恢复外观。当输入在文本框内的命令是一个正确命令时,会出现功能提示。
BoxSharpRunPath插件提供了打开文件夹,打开网址,运行命令的功能。
BoxSharpScripting插件提供了直接运行C#程序的功能。这个功能可以顺便当作表达式计算器用,有时候有些运算(尤其是带N个括号的复杂表达式)想立刻得出结果的,就不用打开计算器了。Print函数是用于将参数值直接写在TextBox里面的。
也可以直接用/script命令打开一个窗口进行复杂的编程。
BoxSharpSearch插件是提供Web搜索功能的,我们可以通过配置文件来配置搜索引擎,插件启动时会自动检测配置项的。
我有时间的话,完全可以写更多的插件,比如自动检测电子邮件,收发邮件,比如滚动播放新闻,比如自动搜新歌下载试听,比如日历,日程安排,约会提示,闹钟,这些都可以作为插件写到里面去。而且,如果,我是说如果,如果很多用户在用这个TextBox的话,他们可以共享他们自己写的插件,将彼此的BoxSharp功能丰富。
好吧,说到底了,.net framework 3.5能办到的,这个TextBox就能办到,但是你估计不会为了计算一个表达式而打开Visual Studio建工程的。这就是TextBox的魅力所在了,HOHO~