朗文英英現代字典輔助工具建議事項
程式設計知識:
取得使用者預設的瀏覽器
by 井民全
關鍵片段: Registry.ClassesRoot.OpenSubKey
Story:
如果你的客戶用的是 FireFox, 那麼他可能不喜歡點選你的程式時, 使用 IExpore 瀏覽網頁.
下面的片段是簡介如何取得使用者預設瀏覽器的執行檔位置.
Sample Index:
1. C++ Win32 範例
2. C# .Net Framework 範例
// C++ 範例片段 (Win32)
TCHAR* getDefaultBrowser() {
// Step 1: 開啟預設瀏覽器的 key
HKEY key;
LONG result=RegOpenKeyEx(HKEY_CLASSES_ROOT,_T("HTTP\\shell\\open\\command"),0, KEY_QUERY_VALUE,&key);
if(result!=ERROR_SUCCESS){
ShowError();
}
// Step 2: 讀取瀏覽器執行檔的指令格式 ex: C:\PROGRA~1\MOZILL~1\FIREFOX.EXE -url "%1"
DWORD Size = 256;
TCHAR buf[256];
RegQueryValueEx (key, NULL, NULL, NULL, (LPBYTE)buf, &Size);
RegCloseKey (key);
// Step 3: 取得執行檔的絕對路徑字串
int index=0;
for(;index<256-3;index++){
bool be=(*(buf+index)=='e' || *(buf+index)=='E');
bool bx=(*(buf+index+1)=='x' || *(buf+index+1)=='X');
bool bee=(*(buf+index+2)=='e' || *(buf+index+2)=='E');
if(be && bx && bee){
break;
}
}
index=index+3; // 包含整個 exe
TCHAR *strBrowser=new TCHAR[256];
if(index!=256-3){
StringCchCopy (strBrowser,index+1,buf);
strBrowser[index]=_T(' '); // 加入空白
strBrowser[index+1]=NULL;
return strBrowser;
}else{
return NULL;
}
}
// C# 範例片段 (.Net Framework)
public static string getDefaultBrowser() {
string browser = string.Empty;
RegistryKey key = null;
try {
key = Registry.ClassesRoot.OpenSubKey(@"HTTP\shell\open\command", false);
browser = key.GetValue(null).ToString().ToLower().Replace("\"", "");
if (!browser.EndsWith("exe")) {
browser = browser.Substring(0, browser.LastIndexOf(".exe")+4);
}
}
finally {
if (key != null) key.Close();
}
return browser;
}
}
程式設計知識:
讀取任意視窗下使用者的鍵盤輸入(熱鍵 Alt+D的實作)
by 井民全
關鍵片段: GetKeyState
Knowledge Requirement: multi-thread Windows progrmaming
1. Windows 下啟動一個 working thread 主要指令
AfxBeginThread(Listen_AltD_Key_ThreadFun,NULL); // 啟動 Alt+D 按鍵的 Listen Thread
2. thread 主程式 (隨時監控使用者是否按下 Alt+D, 若使用者按下則自動將 Help 視窗帶到前面來)
// Thread function 的部分
UINT Listen_AltD_Key_ThreadFun(LPVOID LParam){
WINDOWINFO info;
do{
SHORT AltState=GetKeyState(VK_MENU); // Alt 的狀態
bool bAltDown=(AltState & 0x8000) > 0;
SHORT LKeyState=GetKeyState(0x4C); // L Virtual Key 的狀態
bool bLKeyDown=(LKeyState & 0x8000) > 0;
// 當兩個 Key 同時被按下的時的偵測
if(bAltDown && bLKeyDown){
int kk=0; // <===========
kk++;
}
SleepEx(100,true);
}while(true);
return(0);
}
// end of 隨時監控使用者是否按下 Alt+D
進一步資料: ms-help://MS.MSDNQTR.2004JAN.1033/winui/winui/windowsuserinterface/userinput/keyboardinput/keyboardinputreference/keyboardinputfunctions/getkeystate.htm
感謝 Jing 的貢獻,
不過程式似乎會檢查程式所在的位置,
如果字典安裝的目錄名稱是LDOCE4v2(原v2版的內建目錄名稱),程式檢查目錄名稱不符,會拒絕起動。
所以使用LDOCE4v2版的網友恐怕無法使用了^^;