C++ 控制当前进程输入法和控制其他进程输入法以及获取键盘大小写状态

    
 //当前进程输入法控制
    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 ;
    }
//注册表获取输入法
在资源中展示

 

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值