65.9K
CodeProject 正在变化。 阅读更多。
Home

语言输入模式(主要针对希伯来语程序员)

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.94/5 (15投票s)

2003年5月11日

2分钟阅读

viewsIcon

119679

downloadIcon

1559

如何根据所需的语言模式调整输入。

引言

在我最新的项目“Cabnet”中,我实现了语言输入模式键盘,以限制用户只能输入希伯来语 - 诀窍不是阻止不需要的字母,而是根据需要调整键盘。

详细说明

开发者目标

正如标题所述,本文主要针对希伯来语开发人员。 但事实上,任何处理多语言问题的开发,其中用户必须按下 Alt+Shift && Caps Lock 才能进行语言模式输入切换,都可以使用以下代码。 所以,标题只不过是一个误导的路标。 那我为什么这样做呢? 地方爱国主义? 也许吧。 但是 - 听着 - 虽然大多数时候希伯来语程序员必须使用英语作为沟通工具 - 只有这一次,全世界都必须是希伯来语爱好者,但希望不是希伯来语恐惧症患者才能阅读本文。

问题所在

作为许多客户端应用程序的编写者 - 我过去常常因频繁需要在希伯来语和英语之间更改键盘输入模式而感到沮丧。

原因

虽然通常拥有此选项很有用 - 但很多时候它只是不必要地令人恼火。

示例

假设用户必须在编辑框中键入他的姓名,并且应用程序的要求是使用希伯来语(或其他本地语言)形式。

解决方案

  1. 阻止不需要的字母。
  2. 自动将键盘属性更改为希伯来语输入模式。
您可以实现第一个解决方案,但更明智的是实现第二种方法 - 正如我所做的那样。

演示功能

 void SetEnglishLanguage()
 void SetLanguageDynamic()
 void SetLocalLanguage()

它是如何工作的?

您可能知道,Windows 循环消息传递包含三个函数
 GetMessage()
 TranslateMessage()
 DispatchMessage()
TranslateMessage() 函数的一个作用是扫描控制键的状态 - 因为这些状态是操作消息的触发因素。

所以,诀窍是在翻译过程之前拦截消息 - 如果必要,通过请求当前语言设置来调整语言模式并停用大写锁定 - 这样最终你可以启动内置翻译。

代码片段

BOOL CHebrewEdit::PreTranslateMessage(MSG* pMsg) 
{
    switch(pMsg->message) {

    case WM_KEYDOWN:

      ValidateLanguage();
    
    break;
    default:
    break;
};
    return CEdit::PreTranslateMessage(pMsg);
}
注意CHebrewEdit 名称可以替换为 'CArabicEdit''CChineseEdit' 或全局名称解决方案 'CLocalEdit'

void CHebrewEdit::ValidateLanguage()
{
    int ks;
    
    BOOL caps;

    if (IsLanguageDynamic()) return;
    
    if (m_nLanguage == LANG_M_LOCAL)
        
              SendMessage(WM_INPUTLANGCHANGEREQUEST,5,0x40D040D);
        else
    
    if (m_nLanguage == LANG_M_ENGLISH) {
        
              SendMessage(WM_INPUTLANGCHANGEREQUEST,5,0x4090409);
    }

        else ASSERT(FALSE);

        caps = (IsCapsSet() & 0x01);
    
    if (IsEnglishLanguage()) caps=!caps;
    

    if (caps) { // for capslock
        
    keybd_event(VK_CAPITAL,0,0,0);
    keybd_event(VK_CAPITAL,0,KEYEVENTF_KEYUP,0);

    }
    

}

源代码

我的源代码仅实现了编辑框扩展,虽然代码简单且可移植到其他 Windows 控件,甚至可以通过钩子输入过程来用于整个过程,但如果您渴望达到最佳速度和稳健性,则不建议这样做(参见:SetWindowsHookEx)。
© . All rights reserved.