2008年8月18日 星期一

使用全域熱鍵(Global hotkey)在VB .NET

這篇文章是介紹如何使用VB 2005來編寫可以讀取全域熱鍵(foobar翻成整體熱鍵)的程式,如果你是要找怎麼利用整體熱鍵,那很抱歉你可能迷路了XXD。
在開始寫程式之前,先來稍微介紹一下整體熱鍵的運作方式。
如左圖所示,一般來說,鍵盤上面的訊號是先送給OS處理後,經過管理程序再送給目前活動中(in active)的程序;所以當程式並不是在活動中,那麼自然就不會接收到目前鍵盤的訊號。
而全域熱鍵的用處就在於即使我的程式已經是在背景中,假如鍵盤有相對應的鍵被按下,我的程式也能夠做出想要的回應。而在XP系統下,提供了一個動態函式庫來讓我得以達成以上的需求:user32.dll。我可以藉由user32.dll向管理程序去通知說,我也要接收某些特定的鍵盤訊號,不論我是不是在活動中。註冊完畢後,當鍵盤有訊號進來,管理程序就會看目前進來的訊號是不是有人註冊過,如果有,這個值除了會丟給目前活動中的程序,也會丟給我註冊過的程序。
打個比方好了,就像是像在很常見的網路促銷活動,在一般的情況下如果要知道某商家有沒有特價或是促銷,只能透過商家固定的廣告來得到該資訊,或是要直接到賣場去才能看到。這就是一般的模式下情況,只有固定的一些程序(像是活動中的程序)才能獲得目前鍵盤的資訊。而假如我加入商家的會員,或是到他們的網站上去註冊,那麼就只要打開email(或是實體信箱),就可以知道商家最近有沒有什麼新的特價方案,就只要等著商家就會把訊息傳過來。我的程序也是一樣,一但完成了註冊的動作,負責管理鍵盤訊號的程序就會在有我所觀察的把訊發生之後,一並通知我。
所以在程式的一開始,我必須做這兩行的宣告:
Private Declare Function RegisterHotKey Lib "user32" (ByVal hwnd As IntPtr, ByVal id As Integer, ByVal fsModifiers As Integer, ByVal vk As Integer) As Integer
Private Declare Sub UnregisterHotKey Lib "user32" (ByVal hwnd As IntPtr, ByVal id As Integer)
告訴程式說,在接下來的程式碼中我需要這兩個從user32函式庫中的函式。
接下來的步驟比較繁複一點,須要參看程式碼,不過部落格中的空白都會被清空,內縮的格式會跑掉變得很難看,所以程式碼就貼在google文件中,連結在這。
從form load開始看起,可以看到其中只有一行程式碼,裡面寫的是RegisterGlobalHotKey這個函式,目的是完成整個註冊全域熱鍵的動作,如果懶的去改直接就整個抓去用。比較要注意的是,取得hotkeyID的atomName,原程式碼中是利用threadID去做,不過用這麼麻煩的東西是可以用拉~。而其中 GlobalAddAtom函式就是取得一個類是hash code的東西,他會在系統的atom table寫入原字串以及獲得的atom(類似hash後的key值),在此程式中是利用此函式來得到用來註冊的hotkeyID值。
從form load上面一點看,會看到許多常數的宣告,那些是代表alt, shift, ctrl之類的鍵,不用做任何改變就可以。然後既然有註冊hotkey,當然也要有反註冊的函式UnregisterHotKey,當我們程式要結束的時候通知一下,這個程式已經死掉拉~~不要再寄訊息過來了。所以就照著程式碼那樣把反註冊函式寫完整在UnregisterGlobalHotKey,然後補在form closed(或是closing都可)裡面,讓程式結束後可以把hotkey反註冊掉。
接下來就是最重要的地方拉,如果要讓全域鍵按下後程式有所反應,程式碼就要寫在WndProc裡面。這個函式主要是接收從其他程序丟過來的訊息,所以當丟過來的訊息使說有使用者按下了我所設定的全域鍵,那麼就要給他好好處理一下拉。如果有要在全域熱鍵按下後所執行的程式碼,那麼就要寫在If m.Msg = WM_HOTKEY的裡面。在這個範例中,只做了一個計數器,來計算全域熱鍵被按下幾次,並且在全域熱鍵按下後,將自己設定為活動中的狀態。
這篇就寫到這樣吧,如果要加入全域熱鍵,直接把整篇程式碼給加進去其實也就差不多了XXD,只要把一些地方給改變一下,像是全域熱鍵的設定、按下熱鍵後的處理等比較重要的地方改一下,就可以用了。
在網路上還有找到另外一種做法,一樣是利用user32這個函式庫,又興趣的人可以參考一下^^。
參考網址:
http://www.codeguru.com/vb/gen/vb_system/keyboard/article.php/c4829/
http://www.vbforums.com/showthread.php?t=506461

2008年8月10日 星期日

將音樂檔案轉換成TAK格式

ㄐㄧㄤ~因為上一篇聆聽TAK音樂檔案看起來增加了不少點擊數,所以就先把這篇給補起來吧。^^
其實要將檔案轉換成TAK其實還蠻簡單的,首先到TAK的官網下載最新版本的編碼器(encoder)。目前最新的版本(打這篇文章的時候)是1.0.4。
下載解壓縮,可以發現有幾個資料夾:
  • Applications
  • Deco_Lib
  • Sdk
  • Winamp
而要編碼須要用的只有Applications資料夾內的東西,其他就參看Contents.txt裡面的解說,其中有寫各資料夾內含物是什麼。
在這裡利用foobar2000配合takc.exe來進行轉檔,foobar真是個不錯的東西阿,不但可以拿來聽音樂,支援多種音樂格式,也可以透過各種不同音樂的編碼器來對音樂檔案進行轉檔。把在剛剛解壓縮後的資料夾Applications內的takc給複製到foobar資料夾下(這樣以後管理編碼器可能會比較方便),這樣檔案的準備工作也就可以說是完成了,等等就要開始參數的設定工作。
  1. 打開foobar後,選擇Preferences,然後在Tool中選擇Converter。
  2. 在Converter畫面的中間有個Encodeng Presets,在其右邊選擇Add New。
  3. 最上方的Encoder選擇custom,而接下來那個encoder則是編碼器的路徑,在這邊是Takc.exe的路徑。Extention則填入tak;Parameters請填入-e -ihs -p2 -overwrite - %d;中間那bit depth control不用管,用預設值即可;Encoder name當然就填入TAK,setting就填normal吧。
  4. 在播放清單中,對想要轉檔的檔案按下滑鼠右鍵,選擇convert=>convert to=>在encoding preset挑選 TAK normal就可以把該音樂檔轉成TAK格式。
知到了該怎麼去設定參數,那麼也應該了解一下參數所代表的意義。我們這邊用的參數是:-e -ihs -p2 -overwrite - %d。其中-e是代表我們是要對檔案編碼;-ihs是要給多執行緒用的特殊指令;-p2是壓縮比的模式;-overwrite是直接複寫掉已存在的檔案;%d是foobar給的檔案名稱。

這邊比較重要的是壓縮模式,tak總共提供了6種不同程度的壓縮,由p0到p5壓縮比越來越大,壓縮所需要的時間也越長;另外每個不同的程式還提供了該程度的最大壓縮m,與該程度較高壓縮的e,像是p1的最大就是p1m、較高就是p1e,p2最大就是p2m、較高就是p2e,p5最大則是p5m,也是所有壓縮比中最高的,也可以用pMax來表示。所以6種不同的程度再加上每個壓縮程度還擁有一個max與Extra,所以全部共有18種不同壓縮的比率。雖然官方所認定的noraml是p2,不過記然要壓縮當然要壓最高,所以一般在使用還是會設定到pMax,雖然在編碼的時候需要多花點時間,不過壓縮比還算高,而且也比ape的解碼速度還要來的快。

除了使用foobar配合takc之外,也可以直接使用官方所提供的壓縮解壓縮軟體,與takc同一資料夾內的tak.exe。操作也不難,選擇compress(壓縮)後,把要壓縮的檔案(wav檔)加入,並在option設定好一些參數就可以了。不過因為只支援wav檔,基本上還是foobar來的方便。

這邊也有教學,只要會一些簡單的英文就可以看得懂,如果是使用EAC的人可以去參考看看,這邊因為沒有玩過EAC所以就不寫了~。

p.s. 這篇東西老實說寫的我很灰心,怎麼寫都沒辦法合我的意,寫出來的東西有點...如果有人能夠提一些如何改進這篇文章的意見我會很開心的XD。

2008年7月24日 星期四

談假考部隊

ma...記然是小學生,基本上還是和教育拖離不了關係阿~~(茶
從今天大學聯考前,假考部隊的消息就一直不斷的流出來,除了之前颱風淹大水的新聞把這件是壓掉了好一段時間外,一直到今天剛好是大學網路選填志願的第一天。所以今天就無聊上網看看,有沒有網頁可以一探究竟。不過沒想到除了新聞之外,大多是一些批評的文章,讓人有點失望。
很多人都在擔心,假考部隊會造成怎樣的後果。有的人說會影響考試的公平性,有人說被否認了他們的努力,有人說這是藐視弱勢。我說,終於看到這塊土地的成長,雖然還差得遠。從這些批評當中,我們可以看到許多人已經跳脫在反對的這塊思維,進而到反反對。這是一種進步,是讓人高興的,不過為什麼還差得遠呢?因為放長遠一點來看,假考部隊是一種"現象",或是一個"結果"。而不是一個"因"。批評的人只看到這個現象所帶來的後果,而恐懼擔心。但真正應該憂心的不是現象,應該是造成這個現象的"因",其從何而來?
說穿了,假考部隊不就是台灣社會變遷中的一附帶現象。他的訴求很簡單明瞭:加速大學的退場機制,目的是:提升大學品質,如此而已。
那出現的原因呢?太多太多了...要談太麻煩了,所以就不談了。
屁!就是麻煩事才要談,台灣的每一個錯誤的政策後面,都有太多的原因。不過可以做個簡單的假想歸納:事情是要有人去想要達成才會去做,有很多人的希望,所以有人為了完成別人的願望所以去做,然後有人把這些件事(大家的願望)弄成了大家的事,這就變成了政治。不管中間的過程如何,政策的後面是人的期望,這篇土上的人的期望。不過我們也知道,這塊土地上的人太過於純樸(尤其是前一批的生產階級),一心只想要有個好環境,一直努力消耗、生產。不過,現在的我們知道了新的想法,另一種思維。過去的人不是錯的,但現事是有問題的。解了"因",接下了就是去"改變現況"。
從現象下手嗎?那就太膚淺了。
那?解現在的問題,只有新的想法,只屬於現在的方法。從根本上,我們的教育已經有在改變,我們的孩子現在學習的,思考的已經不同於以往。這條大學之路是否正確,應該要讓他們(準備上路的那群人XD)來思考。

後記:我覺得市場機制還不錯,只不過要建立在健全的認知上,不少台灣人還是不能接受。也許...台灣接受共產也是另一種選擇,我不喜歡就是了...

2008年7月23日 星期三

VM Tools安裝小筆記


最近系統說實在有點不怎麼穩,要我在繼續拿牠來測試新軟體老實說,有點於心不忍,不知道再這樣摧殘下去還能夠用多久...所以就又拿出來VMware。這次的host OS與Guest OS都是XP,理論上對我來說應該式小菜一碟。不過沒想到之前聽說還蠻好用的FastXP(乾淨+SP3),居然在這次安裝中頻頻失敗,一氣之下還是用回傳說中的鬱金香。比較神奇的是...之前一直設定失敗讓我決心砍掉整個VM的網路,居然沒兩下就弄好了。為了下次安裝這邊也來個筆記,最主要的是把VM 網路設定裡面去看一看,把NAT、DHCP都打開,然後把Gateway的位置找到並記下,預設好像是192.168.191.2,192.168.191.1則是host OS的IP。然後把這些資訊在guest OS設定完成就可以了。
安裝完後接下來當然就是要測試軟體阿,不過除了利用網路之外,VM在5.5以後就有提供VM Tools這支工具來達成更簡化的操作。比較常用到的就是支援host os與guest os之前的拖曳,以及其切換不再需要一些特殊的動作,只要滑鼠移到該界面上即可使用。安裝方法如下
  1. 進入guest os中
  2. 在工具列上點選VM=>Install VMware Tools
  3. 開啟guest os中的光碟機,並執行其安裝程式(VMware會暫時將光碟機 map到安裝程式)
  4. 完成
在host os這邊倒是不需要做什麼設定,主要是要注意他會把安裝程式放到光碟機中。另外一個分享資料的方法就是用它內建的Shared folders,在設定上很簡單,只要在工具列上選擇VM=>Settings,然後選Options就會看到設定的項目,再逐一把想要加入的資料夾加入即可。比較麻煩的是究竟設定完後,要在哪裡才找的到這些資料夾呢?答案就是在\\.host這台電腦中!在"網路上的芳鄰"的網址列打上\\.host,資料夾就會出現拉~~。為了方便起見,可以把該資料夾直接設定為網路磁碟機,在每次登入的時候連線,這樣就可以每次開機都可以看到該資料夾的內容了。使用Shared folders的好處是不用同一份資料還要再guest os再佔一份空間,這對只要拿來安裝的檔案或是只有要讀取的檔案都不錯用喔^^。

2008年7月21日 星期一

聆聽TAK檔案格式的音樂


最近稍微將這整個Blog的標籤做了一些小整頓,稍微看起來比較像樣子了。話說google給的標籤範例有問題啦~明明分隔符號是英文的逗號",",但是他卻用頓號"、",害我之前打的都有問題,也懶得一個一個改了,目前就是有事沒事就跑來改一點,看看能在民國幾年能改完XXD。

進入正題,最近開始出頭的音樂檔案格式TAK,相信還沒多少人聽過(在這篇文章生出來的這個時間)。他的全名是Tom's lossless Audio Kompressor,德國出產,首頁。新東西出來就是有新東西的缺點,目前僅有少部分播放軟體支援。在中文環境下,我想能夠被知道且可以支援的軟體應該就只有Winamp以及foobar2000,其他常用的像是MPC、KMPlayer、WMP等都不能。下面就分別來說明要怎麼來播放:
Winamp
  1. 首先到到TAK官網去下載TAK最新的版本,在Download下面就可以找的到,目前是到1.0.4。
  2. 把下載的檔案解壓縮後,會有一個名稱為Winamp的資料夾,把裡面的in_tak.dll複製到系統中Winamp所在的資料夾下的Plugins資料夾。也就是放到"Winamp所在資料夾"\Plugins這個資料夾,系統預設值是C:\Program Files\Winamp\Plugins。
  3. 結束~刪掉下載的壓縮檔與解壓縮的檔案。
foobar2000
  1. 到foobar他朋友家foosion去下載TAK Decoder。基本上要foobar2000 0.9.4以後的版本才有支援,這邊貼個給0.9.5用的快速連結。
  2. 將壓縮檔解壓縮後後,把tak_deco_lib.dll複製到foobar2000所在的資料夾。
  3. 把解壓縮後出現的components資料夾裡面的foo_input_tak.dll複製到foobar2000資料夾下的components資料夾,也就是"foobar200資料夾"\components。
  4. 如果要做檔案關連的話,就把icon資料夾內的檔案也複製到foobar資料夾下的icon資料夾。
  5. 完成~刪掉壓縮與解壓縮的檔案。
其實還蠻簡單的拉,不過在個人常用的foobar下還需要考慮到版本問題實在是有點...
目前已經完成使用foobar2000來encode TAK檔案,下次在來PO上來關於編碼的一些參數設定吧^^
參考連結:http://www.hydrogenaudio.org/forums/index.php?showtopic=54721

2008年7月14日 星期一

VB2005豆知識第一彈


很久沒有來發一些文章了....沒事還是要來補充一些料才好~^^。所以這次的內容就決定是來小談一下一些VB2005比較少人會談到的東西。基本上每個豆知識因為本身就是豆知識,所以當然內容也不會很多,究竟一次該弄多少料出來呢....我也不知道!而老實說呢...料也不多啦~~等改天有需要的時候自然會去研究然後就自己跑出來了~。

首先呢,先來補一下之前說要玩VB foreach的東西,其實我記得大約是寫完那邊JAVA的後一到兩天就玩完了,不過沒啥機會能夠順到PO就一直放在那了XXD。如果要能讓某個類別能夠支援foreach,就必須先實做IEnumerable界面,另外這個介面還需要一個Enumerator,所以必須還要再有一個類別是實做IEnumerator。說穿了,其實就是用一個Enumerator去逐一把整個陣列(或是串列)中的值一個一個丟出去,所以IEnumerable借面就是負責去丟Enumerator給外面呼叫foreach的地方。所以這邊也可很清楚的看到,使用foreach是絕對不適合用來改變Enumerable類別內的值。【範例檔下載】

一開始講就講foreach可能會讓人霧撒撒,沒關係,接下來講點比較簡單的!來談談要如何在VB 2005裡使用外部參數。這邊的外部參數的定義就是像是一般我們在執行程式的時候,有時候為了做一些特別的需要會把參數打在後面,就是檢查網路有時候會用到 ipconfig /all 後面的/all,或是檢查磁碟機時下的指令chkdsk c: /r 後面的c: /r。在C或是JAVA中,我們可以很簡單的重main後面去抓args,那VB2005呢?
其實很簡單,他就在My.Application.CommandLineArgs,要去使用他的話可以用foreach去把裡面的值全部讀出來,然後去做你要的處理就可以了。至於範例就免了吧,太簡單到沒辦法寫了...

那就來期待下期會出現什麼吧!!
如何使用drag and drop
如何使用剪貼簿
如何減少ListBox增加大量資料的時間
如何使用DataGidView表現出類似StringGrid的感覺

嗯....接下來就要等我看還有沒有想到什麼了...