VC下模拟切换输入法 (Input method simulation)

作者:Wupei  |  发表时间:  |  所属分类:VC

其实切换输入法的工作很简单,就需要调用一个函数就可以实现

函数声明:

HKL ActivateKeyboardLayout(
  HKL hkl,     // handle to keyboard layout
  UINT Flags   // keyboard layout flags
);

现在来实现一个CDialog窗体下模拟Windows上输入法切换

实现代码:

//相关变量
bool isShiftDown;		//shift键
bool isCtrlDown;		//ctrl键

BOOL CMyCatchScreenDlg::PreTranslateMessage(MSG* pMsg) 
{
	if (pMsg->message == WM_KEYDOWN)	//键按下
	{
		if(pMsg->wParam == VK_SHIFT)
		{
			isShiftDown = 1;
		}
		else if(pMsg->wParam == VK_CONTROL)
		{
			isCtrlDown = 1;
		}
	}
	
	if (pMsg->message == WM_KEYUP)	//键弹起
	{
		if(pMsg->wParam == VK_SHIFT)
		{
			if (isCtrlDown == 1)
			{
				//Ctrl+Shift
				ActivateKeyboardLayout(
					(HKL)HKL_NEXT,
					KLF_SETFORPROCESS|KLF_UNLOADPREVIOUS
					);
			}
			isShiftDown = 0;
		}
		else if(pMsg->wParam == VK_CONTROL)
		{
			if (isShiftDown == 1)
			{
				//Shift+Ctrl
				ActivateKeyboardLayout(
					(HKL)HKL_NEXT,
					KLF_SETFORPROCESS|KLF_UNLOADPREVIOUS
					);
			}
			isCtrlDown = 0;
		}
		else if(pMsg->wParam == VK_SPACE)
		{
			if(isCtrlDown == 1)
			{
				//Ctrl + Space(没有实现原始的WINDOWS恢复)
				ActivateKeyboardLayout(
					(HKL)HKL_NEXT,
					KLF_SETFORPROCESS|KLF_UNLOADPREVIOUS
					);
			}
		}
	}
	
	return false;
}

模拟的不够完善,相关算法感觉上也不够精良…..有很大的优化空间…

读者可根据上一篇文章"在CDialog直接输入字母或文字的实现",可以实现在CDialog输入并输出文字

 

————————————————————-

ActivateKeyboardLayout函数的相关介绍:

函数功能:激活键盘布局。该函数Windows NT和Windows 95中的实现有很大不同。本参考页中首先给出了完整的Windows
NT的实现,下来又给出了Windows 95版本的实现,以便大家更好地了解二者的区别。在Windows
NT中ActivateKeyboadLayout函数激活一种不同的键盘布局,同时在整个系统中而不仅仅是调用该函数的进程中将该键盘布局设为活动的。

函数原型: HKL ActivateKeyboardLayout( HKL hkl,UINT Flags);

参数:

hkl:将被激活的键盘布局的句柄。该布局必须先调用LeadKeyboadLayout函数装入,该参数必须是键盘分局的句柄,或是如下的值中的一种:

HKL_NEXT:在系统保持的,己装入的布局的循环链表中,选择下一布局。

HKL_PREV:在系统保持的,已装入的布局的循环链表中,选择前一布局。

Flags:定义键盘布局如何被激活。该参数可取如下的一些值:

LFREORDER:若该位被设置,则已装入的键盘布局的循环链路表将被重新排序。若该位没有设置,则循环链路表的顺序不变。例如,若用户激活了英语键盘布局,同时依序装入了法语、德语、西班牙语键盘布局,然后通过设置KLF_REORDE位激活德语键盘布局,则会产生如下顺序:德语、英语、法语、西牙语键盘布局。若激活德语键盘布局时未设置KLF_REORDER位,则产生如下的键盘布局的键盘布局序列:德语、西班牙语、英语、法语。若装入的键盘布局少于三种,则该标志域的值不起作用。

KLF_SETFORPROCESS:在Windows NT
5.0以上版本中使用。该参数用于整个进程中激活指定的键盘布,并向当前进程的所有线程发送WM_INPUTLANGCHANGE消息。

KLF_UNLOADPREVLOUS:卸载先前活动的键盘布局。

返回值:如果函数调用成功,返回值为前一键盘布局的句柄。否则,返回值为零。若要获得更多多错误信息,可调用GetLastError函数。

备注:在任一时刻可以装入多种键盘布局,但一次仅能激活一种布局。装入多种键盘布局使得可以快速地在多种布局之间切换。Windows 95
ACtivateKeyboadLayout函数为当前线程设置输入语言。该函数接受一个键盘布局句柄,该句柄标识键盘的一个局部的和物理布局。

Trackback from your site.

请在这里留言: