MFC没有IMEMode 想软件自动切换到英文状态以便扫码时不会变成汉字。 MFC-自定义控件Edit control。MFC禁用中文输入法

0、直接说最终解决方法:MFC禁用中文输入法

#include 
// 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没有IMEMode 想软件自动切换到英文状态以便扫码时不会变成汉字。 MFC-自定义控件Edit control。MFC禁用中文输入法_第1张图片

MFC没有IMEMode 想软件自动切换到英文状态以便扫码时不会变成汉字。 MFC-自定义控件Edit control。MFC禁用中文输入法_第2张图片 

但MFC edit control在接收扫码时如果当前为中文输入法或者全角就会出错。需要软件来限制。从根本上避免出错。默认只有数字限定。

MFC没有IMEMode 想软件自动切换到英文状态以便扫码时不会变成汉字。 MFC-自定义控件Edit control。MFC禁用中文输入法_第3张图片

 我想要的是半角英文即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 
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即可。

MFC没有IMEMode 想软件自动切换到英文状态以便扫码时不会变成汉字。 MFC-自定义控件Edit control。MFC禁用中文输入法_第4张图片

 上面的,限制输入只能为ascii码也不能解决问题。比如我是五笔中文,我sn为fx123456。我扫码输入fx1时,变成汉字坳,限制了汉字所以还是空,最后变成了23456。

MFC没有IMEMode 想软件自动切换到英文状态以便扫码时不会变成汉字。 MFC-自定义控件Edit control。MFC禁用中文输入法_第5张图片

三、 尝试切换输入法:无效

	// 切换到英文输入法
	//::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());

你可能感兴趣的:(日志,c++复习,mfc,c++,开发语言)