//当前进程输入法控制
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_ALPHANUMERIC; //中文输入状态
}
//标注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_lolpassword, hIMC);
hCurKL = GetKeyboardLayout(0); //保存现有的输入法
ActivateKeyboardLayout(hKL[0], KLF_SUBSTITUTE_OK); //关闭输入法
//其他进程输入法控制
利用 AttachThreadInput 和 WM_INPUTLANGCHANGEREQUEST 消息改变其它进程的输入状态
众所周知,通过 ActivateKeyboardLayout 函数可以改变当前线程的输入法状态,不过最近发现通过 AttachThreadInput 和 WM_INPUTLANGCHANGEREQUEST 连用可以改变任意进程内线程的输入法状态,代码如下:
以下代码通过 GetKeyboardLayoutList 取得首选的中文输入法的 HKL(Keybroad Layout Handle):
HKL g_hklRPC = NULL;
BOOL InitHklRPC()
{
// Find RPC hkl
UINT nMaxHklCnt = GetKeyboardLayoutList(0, NULL);
HKL* p_hklList = (HKL*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, nMaxHklCnt *
sizeof(HKL));
UINT nHklCnt = GetKeyboardLayoutList(nMaxHklCnt, p_hklList);
for(UINT i=0;i<nHklCnt;i++) {
if(LOWORD(p_hklList[i]) == 0x0804) {
g_hklRPC = p_hklList[i];
break;
}
}
HeapFree(GetProcessHeap(), NULL, p_hklList);
return (g_hklRPC == NULL)? FALSE : TRUE;
}
有关 HKL 参见 MSDN“Languages, Locales, and Keyboard Layouts”,HKL 其实是一个混合值,Loword 是一个 Language IDentifier,Hiword 是一个 Device Handle。以上代码只是简单的通过检查HKL的低字是否为中文 RPC(0x804),并取回第一个中文 RPC 的 HKL。
有了 HKL,有趣的节目开始了~~~ 注意,以下代码把当前 focus 所在窗口的输入法状态设为中文:
Cpp代码 收藏代码
HWND hWnd = GetForegroundWindow();
ASSERT(IsWindow(hWnd))
// Get Target Thread ID and Attach Thread Input
DWORD ProcID;
DWORD ThreadID = GetWindowThreadProcessId(hWnd, &ProcID);
AttachThreadInput(GetCurrentThreadId(), ThreadID, TRUE);
// Get Target Window
HWND hWndFocus = GetFocus();
// Post Input Messages
ASSERT(IsWindow(hWndFocus));
// Change Input Language
PostMessage(hWndFocus, WM_INPUTLANGCHANGEREQUEST, (WPARAM)TRUE, (LPARAM)g_hklRPC); // Use Language ID 0x0804(Chinese PRC)
// Detach Thread Input
AttachThreadInput(GetCurrentThreadId(), ThreadID, FALSE);
//获取大小按键状态
if (GetKeyState(VK_CAPITAL))
{
cout<<"大写"<<endl ;
}
else{
cout<<"小写"<<endl ;
}
//注册表获取输入法
在资源中展示