咱們上一節介紹了編寫簡單計算器,實際上也是出於實用角度(這個計算器只要你肯改,確定能作的比微軟自帶的計算器好用)。這一節介紹作簡單的超級熱鍵(所謂的超級熱鍵是指自定義快捷鍵的功能) 編程
超級熱鍵的最關鍵一步是綁定鍵盤鉤子,就是鍵盤按下一組快捷鍵,主窗體可以響應(本身作不了或者想不到怎麼作,就要百度搜別人有沒有成熟的能夠借鑑),先來看別人的範例程序(瞭解什麼是帶類庫輸出的項目,右擊能夠修改爲Demo測試運行,直接運行報錯) 編輯器
也要學會能生成類庫和使用類庫,例如咱們新建一個類庫的項目,看起來跟傳統C#項目沒什麼區別 學習
把上一節咱們寫的FunctionMath這個類直接複製替換掉默認內容,注意引用了System.Windows.Forms,也要在項目引用中右擊添加引用 測試
點擊生成,從新生成解決方案,就能夠看到在Debug目錄下生成了對應的類庫DLL文件(你也能夠修更名字) spa
那麼如何在當前的項目中使用本身寫的類庫呢?把這個DLL複製到你新的項目的Debug目錄下,而後右擊當前項目添加這個DLL的引用 線程
這樣新的項目就能夠添加以前DLL的引用並使用咱們本身定義的屬性和方法了 3d
咱們再看一下對比,在咱們定義FunctionMath的方法的時候,都加了一個前綴叫作static,這個static就是靜態的意思。爲了對比,咱們再在原有的類庫基礎上覆制一份,把static的修飾詞都去掉,而後從新生成DLL orm
把這個DLL覆蓋掉以前的(注意之後寫代碼也只要這樣,把一個類庫更新以後直接覆蓋掉原來的,就至關於更新模塊代碼了,這也是C#比較高效的地方,新的代碼比老的多,因此生成的DLL也比以前要大一點) 視頻
咱們發現這個能夠自動代碼提示FunctionMath2,可是沒法找到他的任何方法,由於這個類已經不是靜態的了(靜態的類不須要聲明類的實例,直接類名.方法名) 對象
那麼如何使用FunctionMath2的方法呢?首先new一個類的實例(非靜態的類須要聲明類的實例,而後實例名.方法名)。那麼從目前這個角度考慮,貌似static的更加省事,想用隨時用,不須要new實例,若是你代碼幾千幾萬行,你可能記不得那麼多類的實例名稱。可是有一些狀況下,用new聲明類的實例更加有意義(好比後面講解通訊的時候,你可能同時須要10個通訊的實例在運行,每一個實例的端口,鏈接的客戶端都是不同的,那麼這個時候就應該分分清楚,就像你有十個銷售,雖然每一個銷售職責都是同樣的,可是每一個銷售負責的客戶都是不一樣的,你認爲把全部銷售任務都丟給一我的完成合適仍是分開了合適?)
這裏再補充一點,修改代碼的時候,要用一些第三方編輯器,好比UltraEdit(也能夠用別的好比Notepad++),這些第三方編輯器比記事本或者word好用多了,有顯示行號,代碼高亮等等功能。咱們爲了測試static的事情,能夠把static 都替換成空(注意是static+空格替換掉,不然會在public和double之間有兩個空格),使用第三方編輯器能夠顯著的提升編程效率。
理解了static的做用,咱們再來理解一下private的做用。若是把某個方法的前綴從public改爲private,那麼咱們在使用的時候就沒法訪問這個方法了,由於這個方法不對外公開(私有=》private),那麼爲何要有這個私有的方法呢?好比你寫一個很複雜的類庫,裏面有大量的中間運算,A方法調用B,B調用C,可是這個類庫對外卻須要保持乾淨(好比數學方法,無論內部多麼複雜,對外就是加減乘除的基本運算,至於你內部怎麼實現的無論,或者你也不想讓別人訪問,弄多了反而讓人以爲亂,弄錯了還要說你這個有問題)。
須要注意的是,除了方法能夠區分public/private,是否有static,類自己,以及類的屬性也是能夠加這樣的修飾符的。好比我能夠在FunctionMath中定義一個圓周率的全局變量(自定義的精度3.1415,這樣下面全部方法均可以統一使用這個圓周率)
那麼若是一旦給類自己添加了static的屬性,他下面全部的屬性和方法都要求是static的(通常不須要這麼作)
有了這些對類和DLL的認識以後,咱們立刻把人家線程的類庫放到本身的程序裏。好比仍是這個程序,咱們勾選了檢測KeyDown以後,就能夠在下面的文本框中檢測到鍵盤的動做(別的鼠標動做也能檢測,能夠本身測試)
查看控件勾選以後執行的具體代碼
再講的明白一點,爲了知道這個m_KeyboardHookManager是什麼玩意,能夠右擊這個對象,轉到定義(結果定位顯示他是KeyboardHookListener類的一個實例,也就是他擁有KeyboardHookListener的全部事件,屬性和方法)
那麼KeyboardHookListener有多少屬性和方法呢?咱們只是知道了KeyDown的事件,接着對咱們感興趣的KeyboardHookListener右擊查看定義,能夠找到他有三個事件(鍵盤按下,鍵盤彈起,鍵盤按壓,貌似鍵盤也就只能有這三種事件了)。
這裏咱們又引入了一個新的名詞事件(event),事件很好理解,就是發生了什麼事情。最多見的控件的事件,好比按鈕的點擊事件,鍵盤的按下事件,固然也有別的事件,好比關機事件,QQ收到一條消息事件,這些都是事件。要完整把一個控件對應的事件搞透是不顯示的,僅僅這個複選框就有這麼多的事件,咱們只須要掌握最多見的幾種便可(並且在這一節咱們暫時不對事件-委託的內容做詳細說明,後面會結合更加實際的範例講解,事件-委託機制仍是C#很是重要的一個內容,讀者既要能看懂別人定義的事件-委託,也要本身能在本身的類庫中寫這樣的事件-委託,這一章節咱們只要簡單的會用便可)
咱們照抄範例代碼,聲明類和類的實例,同時在一樣的地方初始化類(會抄別人的代碼是基本技能,不要以爲丟人,抄也抄不像就談不上創新)
引用完了,聲明完了,接下來就是使用的部分。咱們能夠理解爲,若是複選框checkBox1被勾選,則m_KeyboardHookManager的KeyDown事件發生以後,就讓HookManager_KeyDown方法執行(至於m_KeyboardHookManager爲何可以隨時響應咱們的鍵盤的KeyDown事件,咱們就不須要操心了,人家封裝好的類庫,這裏咱們只要會用),你隨時能夠右擊方法找到具體幹什麼,這裏咱們只是讓某個文本框顯示剛纔的按鍵,跟範例代碼差很少。
來驗證一下咱們的功能,確實能夠了(讀者也能夠接着學習如何把響應鼠標的部分移植過來,這裏就不作深刻探討了)
須要說明的是,綁定鍵盤鉤子的方法不止一個,在附件的參考代碼中,我也給出了別人的其餘作法(好比調用WIN API參數什麼的,不用考慮業務邏輯也能直接構建組合熱鍵,讀者也能夠移植他們的代碼)
更多教學視頻和資料下載,歡迎關注如下信息:
個人優酷空間:
http://i.youku.com/acetaohai123
個人在線論壇:
http://csrobot.gz01.bdysite.com/
問題交流:
QQ:910358960