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

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());
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小黄人软件

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值