#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); //關閉輸入法
}
文章轉自: http://topic.csdn.net/t/20030926/14/2303213.html
---(下面是自己添加的)------------------------------------------------------------------------------------
同樣對于日文輸入法而言,可以通過上面的方法進行全半角切換,不過還有個前提:上面的方法需要打開IME才行,因為在“直接入力”(Direct Input)狀态上面的方法不能切換全半角等狀态,如果需要由“直接入力”(Direct Input)切換到其他如"ひらがな"等狀态,需要通過::ImmSetOpenStatus(hImc, TRUE);打開IME,同樣如果想由其他狀态切換到“直接入力”(Direct Input),隻需::ImmSetOpenStatus(hImc, FALSE);即可