0、直接说最终解决方法:MFC禁用中文输入法
#include <Imm.h>
// Function for Disabling IME 禁用中文输入法
void DisableIME(HWND hWnd)
{
HIMC m_hImc; // 全局或者成员变量
//HWND hWnd = pWnd->GetDlgItem(IDC_EDIT1)->m_hWnd;
if (hWnd && IsWindow(hWnd))
{
// Get input context for backup.
m_hImc = ImmGetContext(hWnd);
// Remove association the testing
if (m_hImc)
ImmAssociateContext(hWnd, NULL);
// Release input context
ImmReleaseContext(hWnd, m_hImc);
::SetFocus(hWnd);
}
}
调用
BOOL CLabelCmpDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
DisableIME(pWnd->GetDlgItem(IDC_EDIT1)->m_hWnd); //禁用中文输入法
一、C#是怎么做到的?
C#文本框自带一个IMEMODE的属性。但MFC没有这个。怎么办呢?
但MFC edit control在接收扫码时如果当前为中文输入法或者全角就会出错。需要软件来限制。从根本上避免出错。默认只有数字限定。
我想要的是半角英文即Alpha,首先想想C#是怎么实现在的?
如果每个edit control都加上_KeyPress事件来处理,太费劲。
二、MFC-自定义控件Edit control。不能解决问题。
用MFC 帮写个类,继承edit control类,只接受半角英文即ascii
CAlphaEdit.h
#pragma once
#ifndef CALPHAEDIT_H
#define CALPHAEDIT_H
//只允许输入ascii
class CAlphaEdit : public CEdit {
DECLARE_DYNAMIC(CAlphaEdit)
//public:
// CAlphaEdit();
// virtual ~CAlphaEdit();
protected:
DECLARE_MESSAGE_MAP()
afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
};
#endif
CAlphaEdit.cpp
#include "../pch.h"
#include "CAlphaEdit.h"
#include <cctype>
IMPLEMENT_DYNAMIC(CAlphaEdit, CEdit)
//CAlphaEdit::CAlphaEdit()
//{
//}
//CAlphaEdit::~CAlphaEdit()
//{
//}
BEGIN_MESSAGE_MAP(CAlphaEdit, CEdit)
ON_WM_CHAR()
END_MESSAGE_MAP()
void CAlphaEdit ::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) {
// 只接受半角英文或数字输入
if (!__isascii(nChar)) {
//logger.ERROR_F("禁止输入非ASCII字符");
return; // 禁止输入非ASCII字符
}
CEdit::OnChar(nChar, nRepCnt, nFlags);
}
调用。把CEdit改成CAlphaEdit即可。
上面的,限制输入只能为ascii码也不能解决问题。比如我是五笔中文,我sn为fx123456。我扫码输入fx1时,变成汉字坳,限制了汉字所以还是空,最后变成了23456。
三、 尝试切换输入法:无效
// 切换到英文输入法
//::SendMessage(this->m_hWnd, WM_INPUTLANGCHANGEREQUEST, 1, 0);
加载默认输入法
//HKL layout = LoadKeyboardLayout(0, KLF_ACTIVATE);
切换到英文输入法
//layout = LoadKeyboardLayout("04090409", KLF_ACTIVATE); // 美国英语输入法
SetThreadInputLocale(MAKELCID(layout, SORT_DEFAULT));
ActivateKeyboardLayout(layout, KLF_ACTIVATE);
UnloadKeyboardLayout(layout);
//CString temp = "";
//GetKeyboardLayoutName(temp.GetBuffer(1000)); temp.ReleaseBuffer();
//logger.INFO_F(FUN_LINE+temp.GetBuffer());