Visual C++ 7.1Visual Studio 6Visual C++ 7.0Windows 2003Windows 2000Visual C++ 6.0Windows XPMFC中级开发Visual StudioWindowsC++
语言输入模式(主要针对希伯来语程序员)






2.94/5 (15投票s)
2003年5月11日
2分钟阅读

119679

1559
如何根据所需的语言模式调整输入。
引言
详细说明
开发者目标
正如标题所述,本文主要针对希伯来语开发人员。 但事实上,任何处理多语言问题的开发,其中用户必须按下 Alt+Shift && Caps Lock 才能进行语言模式输入切换,都可以使用以下代码。 所以,标题只不过是一个误导的路标。 那我为什么这样做呢? 地方爱国主义? 也许吧。 但是 - 听着 - 虽然大多数时候希伯来语程序员必须使用英语作为沟通工具 - 只有这一次,全世界都必须是希伯来语爱好者,但希望不是希伯来语恐惧症患者才能阅读本文。
问题所在
作为许多客户端应用程序的编写者 - 我过去常常因频繁需要在希伯来语和英语之间更改键盘输入模式而感到沮丧。原因
虽然通常拥有此选项很有用 - 但很多时候它只是不必要地令人恼火。示例
假设用户必须在编辑框中键入他的姓名,并且应用程序的要求是仅使用希伯来语(或其他本地语言)形式。解决方案
- 阻止不需要的字母。
- 自动将键盘属性更改为希伯来语输入模式。
演示功能
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
)。