朋友,可曾想過把所有的事情都放到一個(gè)TextBox里面去做?今天我就做了一個(gè),理論上可以干任何事情的TextBox。嘿嘿。
實(shí)習(xí)的日子實(shí)在是挺忙,CNScript還停留在語法分析的階段,一直沒時(shí)間去打開那個(gè)大工程(其實(shí)是有時(shí)間的,可惜零碎的時(shí)間都被我拿來寫這篇文章要講的這些小東西了)。
我們在瀏覽網(wǎng)頁時(shí),或許會(huì)突然想打開某個(gè)程序,比如計(jì)算器,算點(diǎn)東西;又可能想打開Photoshop,處理一下網(wǎng)頁上的某個(gè)圖片;又可能想打開記事本,摘抄一些文字。這時(shí)我們不得不回到桌面,或者打開那個(gè)碩大的開始菜單,在程序里面去找我們想要的東西。
有的時(shí)候,我們還會(huì)重復(fù)做一些機(jī)械的動(dòng)作,比如讀一個(gè)文件,檢查是否有變動(dòng),比如檢查某個(gè)文件夾,看是否有新文件。當(dāng)然,你可以寫一個(gè)程序來完成這個(gè)操作,但是有時(shí)候這種操作你覺得最多就重復(fù)個(gè)兩三次,你不會(huì)愿意去打開Visual Studio創(chuàng)建一個(gè)工程。
歸結(jié)本質(zhì),我們就是想要一個(gè)隨叫隨到的,可以有一定能力幫我們做事情的東西。但是如果這個(gè)東西太大,會(huì)擋住我們正在瀏覽的網(wǎng)頁或者正在處理的文檔,那就不好了。所以我就想到了一個(gè)Topmost的TextBox,放在屏幕的頂端,也就是一般窗口的標(biāo)題欄那里,這樣子不會(huì)擋住你要做的事情,而且在需要的時(shí)候 只要鼠標(biāo)一移過去就可以用了。
OK,有了這樣一個(gè)TextBox,“隨叫隨到”已經(jīng)完成了。但是我們需要這個(gè)TextBox有一定能力,比如我想運(yùn)行一個(gè)程序,它能幫我運(yùn)行,我想搜索一個(gè)詞語,他能幫我搜索,我想打開一個(gè)URL,他能幫我打開,我想計(jì)算一個(gè)表達(dá)式,他能幫我計(jì)算。但是人的需求是無限的,我們隨時(shí)會(huì)有新的需要,他不可能擁有所有的功能,那么如何讓他有能力做到任何事情呢?我們需要一種很強(qiáng)悍的可擴(kuò)展性。玩過魔獸世界的朋友們一定知道,魔獸世界提供一個(gè)插件機(jī)制,玩家可以為游戲?qū)懖寮瑏碡S富游戲的功能,現(xiàn)在已經(jīng)有千千萬萬的魔獸世界插件在各大網(wǎng)站上提供下載了,正是因?yàn)槿绱耍ЙF世界才擁有著這么強(qiáng)的可擴(kuò)展性。所以,我們這個(gè)TextBox也要用插件機(jī)制來驅(qū)動(dòng)。在C#的Microsoft.CSharp名字空間中有一個(gè)C#的編譯器,可以將C#代碼編譯成托管組件,直接生成在內(nèi)存中,以反射的方式來運(yùn)行,這個(gè)機(jī)制為我們快速實(shí)現(xiàn)一個(gè)插件系統(tǒng)提供了可能。因此我選用了.net framework 3.5,用Windows Presentation Foundation來做界面,用C#來當(dāng)我的腳本語言。
俗話說,一不做,二不休,既然提供了插件,那我主程序除了運(yùn)行插件以外就什么都不做了。運(yùn)行了插件之后,將界面所有控件的控制權(quán)都交給插件,插件愛干啥就干啥去。主程序就是一個(gè)Window,Window上是一個(gè)StackPanel,Panel里面是一個(gè)TextBox,僅此而已。當(dāng)然,插件可以向StackPanel里面加?xùn)|西,以豐富這個(gè)條條的外觀內(nèi)容。
可執(zhí)行程序的環(huán)境如下所示:(BoxSharp是這個(gè)程序的名字)
其中BoxSharpCore,BoxSharpRunPath,BoxSharpScripting,BoxSharpSearch是我剛寫好的幾個(gè)插件。
BoxSharpCore插件提供了最基本的/exit命令,用于退出程序。此插件還控制了一些外觀方面的細(xì)節(jié),包括自動(dòng)記住TextBox上次退出時(shí)的位置,大小,用于下次啟動(dòng)時(shí)恢復(fù)外觀。當(dāng)輸入在文本框內(nèi)的命令是一個(gè)正確命令時(shí),會(huì)出現(xiàn)功能提示。
BoxSharpRunPath插件提供了打開文件夾,打開網(wǎng)址,運(yùn)行命令的功能。
BoxSharpScripting插件提供了直接運(yùn)行C#程序的功能。這個(gè)功能可以順便當(dāng)作表達(dá)式計(jì)算器用,有時(shí)候有些運(yùn)算(尤其是帶N個(gè)括號(hào)的復(fù)雜表達(dá)式)想立刻得出結(jié)果的,就不用打開計(jì)算器了。Print函數(shù)是用于將參數(shù)值直接寫在TextBox里面的。
也可以直接用/script命令打開一個(gè)窗口進(jìn)行復(fù)雜的編程。
BoxSharpSearch插件是提供Web搜索功能的,我們可以通過配置文件來配置搜索引擎,插件啟動(dòng)時(shí)會(huì)自動(dòng)檢測配置項(xiàng)的。
我有時(shí)間的話,完全可以寫更多的插件,比如自動(dòng)檢測電子郵件,收發(fā)郵件,比如滾動(dòng)播放新聞,比如自動(dòng)搜新歌下載試聽,比如日歷,日程安排,約會(huì)提示,鬧鐘,這些都可以作為插件寫到里面去。而且,如果,我是說如果,如果很多用戶在用這個(gè)TextBox的話,他們可以共享他們自己寫的插件,將彼此的BoxSharp功能豐富。
好吧,說到底了,.net framework 3.5能辦到的,這個(gè)TextBox就能辦到,但是你估計(jì)不會(huì)為了計(jì)算一個(gè)表達(dá)式而打開Visual Studio建工程的。這就是TextBox的魅力所在了,HOHO~