#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);即可