切換輸入法半形全形(開啟關閉輸入法)
#include "winuser.h"
#include "imm.h"
#pragma comment(lib,"imm32")
HKL hKL[2];
HKL hCurKL;
hCurKL=GetKeyboardLayout(0); //儲存初始輸入法
GetKeyboardLayoutList(2,hKL); //獲取輸入法列表,只獲取兩項
void CIMESampleDlg::OnSetfocusEdit1()
{
// TODO: Add your control notification handler code here
if(hCurKL==hKL[0]) hCurKL=hKL[1]; //選擇第一種輸入法
ActivateKeyboardLayout(hCurKL,KLF_SUBSTITUTE_OK); //切換輸入法
HIMC hIMC;
DWORD dwConv, dwSent;
hIMC=ImmGetContext(m_hWnd);
ImmGetConversionStatus(hIMC,&dwConv,&dwSent);
if((dwConv & IME_CMODE_LANGUAGE) != IME_CMODE_NATIVE)
{
dwConv &= ~IME_CMODE_LANGUAGE;
dwConv |= IME_CMODE_NATIVE; //中文輸入狀態
}
//標註1
if (!(dwConv & IME_CMODE_FULLSHAPE)) dwConv |= IME_CMODE_FULLSHAPE; //全形
if (!(dwConv & IME_CMODE_SYMBOL)) dwConv |= IME_CMODE_SYMBOL; //中文標點
//標註2
//若要切換輸入法為半形,只需把上面的標註1判斷改為如下即可(自己用到時有此要求,所以在原作者繼承上自己改了下)
if (dwConv & IME_CMODE_FULLSHAPE)
dwConv &= ~IME_CMODE_FULLSHAPE;
if (dwConv & IME_CMODE_SYMBOL)
dwConv &= ~IME_CMODE_SYMBOL;
ImmSetConversionStatus(hIMC,dwConv,dwSent);
ImmReleaseContext(m_hWnd,hIMC);
}
void CIMESampleDlg::OnKillfocusEdit1()
{
// TODO: Add your control notification handler code here
hCurKL=GetKeyboardLayout(0); //儲存現有的輸入法
ActivateKeyboardLayout(hKL[0],KLF_SUBSTITUTE_OK); //關閉輸入法
}
---(下面是自己新增的)------------------------------------------------------------------------------------
同樣對於日文輸入法而言,可以通過上面的方法進行全半形切換,不過還有個前提:上面的方法需要開啟IME才行,因為在“直接入力”(Direct Input)狀態上面的方法不能切換全半形等狀態,如果需要由“直接入力”(Direct Input)切換到其他如"ひらがな"等狀態,需要通過::ImmSetOpenStatus(hImc, TRUE);開啟IME,同樣如果想由其他狀態切換到“直接入力”(Direct Input),只需::ImmSetOpenStatus(hImc, FALSE);即可