2013-05-27 155 views
1

問題是這樣的:我必須與用戶的語言設置爲簡體中國和鍵盤「中國(簡體) - 微軟拼音新體驗輸入ST」。設置設備標識符()

通過在控制面板(區域 - >鍵盤和語言)中手動設置這個組合,然後運行一個調用GetKeyboardLayoutName()的小測試程序,我發現KLID是00000804(據推測)。如果我從控制面板中的鍵盤和語言除去中國和運行這個:

HKL hKeyboardLayout = ::LoadKeyboardLayout(_T("00000804"), KLF_ACTIVATE | KLF_SETFORPROCESS); 

那麼這種語言的確改變中國,但鍵盤的設置是錯誤的。輸入內容時,缺少「輸入法框」。

MSDN page爲LoadKeyboardLayout()表示,這對pwszKLID參數:

輸入區域標識符的名稱來加載。該名稱是由語言標識符(低位字)的十六進制值和設備標識符(高位字)組成的字符串。例如,美國英語具有0x0409的語言標識符,所以主美國英文版式被命名爲「00000409」。美式英語版式的變體(例如Dvorak版式)被命名爲「00010409」,「00020409」等。

所以它看起來好像GeyKeyboardLayout()只報告語言標識符(英語 - 伯利茲爲中國),但「設備標識符」丟失。如何找到「微軟拼音新體驗輸入法」的設備標識符?

回答

1

找到了解決辦法。顯然,在Vista(及以後)中,您必須使用帶有正確GUID(不KLID)的InstallLayoutOrTip()來安裝正確的語言鍵盤組合。然後你可以調用LoadKeyboardLayout()來加載它。

typedef HRESULT (WINAPI *PTF_INSTALLLAYOUTORTIP)(LPCWSTR psz, DWORD dwFlasg); 

// Install. 

HMODULE hInputDLL = LoadLibrary(_T("input.dll")); 
BOOL bRet = FALSE; 

if(hInputDLL == NULL) 
{ 
    // Error 
} 
else 
{ 
    PTF_INSTALLLAYOUTORTIP pfnInputLayoutOrTip; 
    pfnInputLayoutOrTip = (PTF_INSTALLLAYOUTORTIP)GetProcAddress(hInputDLL, "InstallLayoutOrTip"); 

    if(pfnInputLayoutOrTip) 
    { 
     bRet = (*pfnInputLayoutOrTip)(_T("0804:{81D4E9C9-1D3B-41BC-9E6C-4B40BF79E35E}{F3BA9077-6C7E-11D4-97FA-0080C882687E}"), 0); 
     if(! bRet) 
     { 
      // Error 
     } 
    } 
    else 
    { 
     // Error 
    } 

    FreeLibrary(hInputDLL); 
} 

// Load. 

HKL hKeyboardLayout = ::LoadKeyboardLayout(_T("00000804"), KLF_ACTIVATE | KLF_SETFORPROCESS); 

參考文獻:

http://msdn.microsoft.com/library/bb847909.aspx

http://www.siao2.com/2007/12/01/6631463.aspx

+0

我不允許上面張貼,因爲我沒有足夠的聲譽另請參照:http://blogs.msdn。 com/b/michkap/archive/2009/09/15/9894707.aspx –

+0

您的代碼必須如此複雜嗎?你爲什麼不採用從GetKeyboardLayoutList()返回的值? – Elmue