帮帮忙:怎样在EDIT框编辑时自动切换为全角的中文输入法?

时间:2022-11-22 23:39:12
我想在某个EDIT控件得到焦点时,输入法自动切换到中文全角,请问大家该怎么办?我是新手,希望有些sourcecode 提示!

11 个解决方案

#1


在VB里好象改一个属性就可以了,在VC里不知道,有时间研究研究。

#2


关注这个问题。

#3


大家关注

#4


昨天对该问题进行了初步研究,MSDN上有关于输入法控制函数的说明,但在使用上仅提供了一个SDK的例子,我现在能够实现中英文以及全半角的转换,但无法在EDIT获的焦点时调出输入法,需要手动调出。这些函数包含在imm.h中,链接库为imm32.lib,可以通过关键字IME在MSDN中查找相关信息,IME---Input Method Edit.
    不知VB中是怎么做的,只需要设置一下textbox的IMEMode属性即可实现打开输入法。在VC中用MSDN上的函数打开输入法,好象不起作用,MSDN的例子好象也没有做到。

#5


所有问题已经解决,但怎不见楼主踪影?
但愿我花了一整天苦心研究的结果没有白费。现在挑选相关代码贴出来。
#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;     //中文输入状态
}

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);    //关闭输入法
}

#6


哈哈

#7


不错

#8


to scie() :
楼主不在,我给你加分~

#9


搂主失踪了!

#10


在这种情况下,你必须的自己手动才有可能会切换过来的,因为没有遇到过这样的情况,所以也不是很清楚的,因为不是什么高手,所以有关这方面的程序也没有过多的时间去看,你有没有手动去试一下呢?
希望你试一下,兴许它就是手动的.好运!!!

#11


俺就不明白了,有些人回复之前怎么不看看前面的帖子就在这里大放厥词呢?

#1


在VB里好象改一个属性就可以了,在VC里不知道,有时间研究研究。

#2


关注这个问题。

#3


大家关注

#4


昨天对该问题进行了初步研究,MSDN上有关于输入法控制函数的说明,但在使用上仅提供了一个SDK的例子,我现在能够实现中英文以及全半角的转换,但无法在EDIT获的焦点时调出输入法,需要手动调出。这些函数包含在imm.h中,链接库为imm32.lib,可以通过关键字IME在MSDN中查找相关信息,IME---Input Method Edit.
    不知VB中是怎么做的,只需要设置一下textbox的IMEMode属性即可实现打开输入法。在VC中用MSDN上的函数打开输入法,好象不起作用,MSDN的例子好象也没有做到。

#5


所有问题已经解决,但怎不见楼主踪影?
但愿我花了一整天苦心研究的结果没有白费。现在挑选相关代码贴出来。
#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;     //中文输入状态
}

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);    //关闭输入法
}

#6


哈哈

#7


不错

#8


to scie() :
楼主不在,我给你加分~

#9


搂主失踪了!

#10


在这种情况下,你必须的自己手动才有可能会切换过来的,因为没有遇到过这样的情况,所以也不是很清楚的,因为不是什么高手,所以有关这方面的程序也没有过多的时间去看,你有没有手动去试一下呢?
希望你试一下,兴许它就是手动的.好运!!!

#11


俺就不明白了,有些人回复之前怎么不看看前面的帖子就在这里大放厥词呢?