各位大俠,小弟不才,又來發問了!
最近做個虛擬鍵盤,想獲取當前輸入法,并顯示到Label上!隨著輸入法的切換,會變!還有一個就是,想通過點擊一個Button達到直接輸入"http://www."這些網站開頭,方便些!請大俠指導!
uj5u.com熱心網友回復:
搜了一下,轉過來,原帖在http://hi.baidu.com/%D0%A1code/blog/item/6bcf98f819337ad4b58f312d.html
以下為轉貼------------------------------------
void GetCurrentIME() //獲取當前輸入法
{
char pwszKLID[KL_NAMELENGTH];
ZeroMemory(pwszKLID,KL_NAMELENGTH);
GetKeyboardLayoutName(pwszKLID);
HKEY hKey;
LPCTSTR lpSubKey="System\\CurrentControlSet\\Control\\Keyboard Layouts\\";//存放輸入法資訊的鍵;
long ret =RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpSubKey, 0, KEY_READ, &hKey);
if (ERROR_SUCCESS != ret) return;
CHAR achKey[MAX_PATH];
DWORD cbMaxSubKey = MAX_PATH;
DWORD i = 0;
while (RegEnumKeyEx(hKey, i, achKey, &cbMaxSubKey, NULL, NULL, NULL, NULL) ==ERROR_SUCCESS)
{
if(strcmp(pwszKLID,achKey)==0)
{
char curStrKey[MAX_PATH];
ZeroMemory(curStrKey,MAX_PATH);
strcat(curStrKey,lpSubKey);
strcat(curStrKey,"\\");
strcat(curStrKey,achKey);
HKEY hImeKey;
char KeyValue[MAX_PATH];
DWORD dwTpye=REG_SZ;
DWORD dwStrLen=MAX_PATH;
ZeroMemory(KeyValue,MAX_PATH);
RegOpenKeyEx(HKEY_LOCAL_MACHINE, curStrKey, 0, KEY_WRITE|KEY_READ, &hImeKey);
RegQueryValueEx(hImeKey,"Layout Text",0,&dwTpye,(LPBYTE)KeyValue,&dwStrLen);
MessageBox(NULL,KeyValue,"",0);
}
ZeroMemory(achKey,MAX_PATH);
cbMaxSubKey = MAX_PATH;
i++;
}
RegCloseKey(hKey);
}
//VS2008 + xp Dll Hook中測驗成功
先來談談系統存放輸入法資訊的地方.
打開注冊表到HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Control\\Keyboard Layouts\\
這里面有很多檔案夾,每個都以一個8個字長的字串命名,
點擊其中任何一個,可以看到其中有兩個主鍵值,都為REG_SZ型,
一個是Layout File,記錄該輸入法所用的DLL,
一個是Layout Text,記錄該輸入法的中文名稱.
事實上,那8個字長的字串就是這個輸入法的ID.
知道了這些,下面我們就來處理如果得到當前使用的輸入法.
先看看一個WindAPI函式:
BOOL GetKeyboardLayoutName(
LPTSTR pwszKLID // input locale identifier name
);
這個函式可以輕松地得到系統當前正在使用的輸入法的ID,
那問題就很明顯了,我們要得到的就是這個ID所對應的輸入法的名稱.
這樣,上面所談的注冊表就派上用場了,
因為HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Control\\Keyboard Layouts\\ 下所有
有的檔案夾都是以輸入法ID的名稱命名的,
我們只要把得到的輸入法的ID定位到該檔案夾,
就可以從其中的一個鍵: Layout Text得到輸入法的中文名稱
uj5u.com熱心網友回復:
代碼: AnsiString GetCurrentIME2() //獲取當前輸入法
{
char pwszKLID[KL_NAMELENGTH];
AnsiString str;
ZeroMemory(pwszKLID,KL_NAMELENGTH);
GetKeyboardLayoutName(pwszKLID);
HKEY hKey;
LPCTSTR lpSubKey="System\\CurrentControlSet\\Control\\Keyboard Layouts\\";//存放輸入法資訊的鍵;
long ret =RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpSubKey, 0, KEY_READ, &hKey);
if (ERROR_SUCCESS != ret) return "";
CHAR achKey[MAX_PATH];
DWORD cbMaxSubKey = MAX_PATH;
DWORD i = 0;
while (RegEnumKeyEx(hKey, i, achKey, &cbMaxSubKey, NULL, NULL, NULL, NULL) ==ERROR_SUCCESS)
{
if(strcmp(pwszKLID,achKey)==0)
{
char curStrKey[MAX_PATH];
ZeroMemory(curStrKey,MAX_PATH);
strcat(curStrKey,lpSubKey);
strcat(curStrKey,"\\");
strcat(curStrKey,achKey);
HKEY hImeKey;
char KeyValue[MAX_PATH];
DWORD dwTpye=REG_SZ;
DWORD dwStrLen=MAX_PATH;
ZeroMemory(KeyValue,MAX_PATH);
RegOpenKeyEx(HKEY_LOCAL_MACHINE, curStrKey, 0, KEY_WRITE|KEY_READ, &hImeKey);
RegQueryValueEx(hImeKey,"Layout Text",0,&dwTpye,(LPBYTE)KeyValue,&dwStrLen);
//MessageBox(NULL,KeyValue,"",0);
str = KeyValue;
}
ZeroMemory(achKey,MAX_PATH);
cbMaxSubKey = MAX_PATH;
i++;
}
RegCloseKey(hKey);
return str;
}
uj5u.com熱心網友回復:
代碼: AnsiString GetCurrentIME2() //獲取當前輸入法
{
char pwszKLID[KL_NAMELENGTH];
AnsiString str;
ZeroMemory(pwszKLID,KL_NAMELENGTH);
GetKeyboardLayoutName(pwszKLID);
HKEY hKey;
LPCTSTR lpSubKey="System\\CurrentControlSet\\Control\\Keyboard Layouts\\";//存放輸入法資訊的鍵;
long ret =RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpSubKey, 0, KEY_READ, &hKey);
if (ERROR_SUCCESS != ret) return "";
CHAR achKey[MAX_PATH];
DWORD cbMaxSubKey = MAX_PATH;
DWORD i = 0;
while (RegEnumKeyEx(hKey, i, achKey, &cbMaxSubKey, NULL, NULL, NULL, NULL) ==ERROR_SUCCESS)
{
if(strcmp(pwszKLID,achKey)==0)
{
char curStrKey[MAX_PATH];
ZeroMemory(curStrKey,MAX_PATH);
strcat(curStrKey,lpSubKey);
strcat(curStrKey,"\\");
strcat(curStrKey,achKey);
HKEY hImeKey;
char KeyValue[MAX_PATH];
DWORD dwTpye=REG_SZ;
DWORD dwStrLen=MAX_PATH;
ZeroMemory(KeyValue,MAX_PATH);
RegOpenKeyEx(HKEY_LOCAL_MACHINE, curStrKey, 0, KEY_WRITE|KEY_READ, &hImeKey);
RegQueryValueEx(hImeKey,"Layout Text",0,&dwTpye,(LPBYTE)KeyValue,&dwStrLen);
//MessageBox(NULL,KeyValue,"",0);
str = KeyValue;
}
ZeroMemory(achKey,MAX_PATH);
cbMaxSubKey = MAX_PATH;
i++;
}
RegCloseKey(hKey);
return str;
}
uj5u.com熱心網友回復:
代碼: AnsiString GetCurrentIME2() //獲取當前輸入法
{
char pwszKLID[KL_NAMELENGTH];
AnsiString str;
ZeroMemory(pwszKLID,KL_NAMELENGTH);
GetKeyboardLayoutName(pwszKLID);
HKEY hKey;
LPCTSTR lpSubKey="System\\CurrentControlSet\\Control\\Keyboard Layouts\\";//存放輸入法資訊的鍵;
long ret =RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpSubKey, 0, KEY_READ, &hKey);
if (ERROR_SUCCESS != ret) return "";
CHAR achKey[MAX_PATH];
DWORD cbMaxSubKey = MAX_PATH;
DWORD i = 0;
while (RegEnumKeyEx(hKey, i, achKey, &cbMaxSubKey, NULL, NULL, NULL, NULL) ==ERROR_SUCCESS)
{
if(strcmp(pwszKLID,achKey)==0)
{
char curStrKey[MAX_PATH];
ZeroMemory(curStrKey,MAX_PATH);
strcat(curStrKey,lpSubKey);
strcat(curStrKey,"\\");
strcat(curStrKey,achKey);
HKEY hImeKey;
char KeyValue[MAX_PATH];
DWORD dwTpye=REG_SZ;
DWORD dwStrLen=MAX_PATH;
ZeroMemory(KeyValue,MAX_PATH);
RegOpenKeyEx(HKEY_LOCAL_MACHINE, curStrKey, 0, KEY_WRITE|KEY_READ, &hImeKey);
RegQueryValueEx(hImeKey,"Layout Text",0,&dwTpye,(LPBYTE)KeyValue,&dwStrLen);
//MessageBox(NULL,KeyValue,"",0);
str = KeyValue;
}
ZeroMemory(achKey,MAX_PATH);
cbMaxSubKey = MAX_PATH;
i++;
}
RegCloseKey(hKey);
return str;
}
uj5u.com熱心網友回復:
有人區分過美式鍵盤和其他鍵盤模型的嗎
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/130021.html
標籤:Windows SDK/API
上一篇:隨機生成10個100位的大素數
下一篇:求助QuickReport 中的SubDetail翻頁問題