为啥 Ctrl + A 在 CEdit 中不起作用?

Posted

技术标签:

【中文标题】为啥 Ctrl + A 在 CEdit 中不起作用?【英文标题】:Why doesn't Ctrl + A work in CEdit?为什么 Ctrl + A 在 CEdit 中不起作用? 【发布时间】:2015-09-01 17:01:31 【问题描述】:

我一直在 MFC 项目中工作,我发现 Ctrl + A 不适用于该项目中使用的任何 CEdit。

但是如果我在我的项目的 StdAfx.h 文件中添加以下行,它会突然开始工作。

#pragma comment(linker,"\"/manifestdependency:type='win32' \
name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")

现在我从这段代码 sn-p 中了解到,我们明确告诉链接器我们要使用 ComCtl32.dll 6.0 版。

这是否意味着,如果没有这一行,我的项目将使用不支持 Ctrl + A 的较早版本的 ComCtl32.dll?

【问题讨论】:

【参考方案1】:

看起来Ctrl-A 在该版本中默认未处理。如果想要Ctrl-A支持,需要从CEdit扩展并实现PreTranslateMessage

See here.

void CEditExtended::PreTranslateMessage(MSG* pMsg)

     if(pMsg->message == WM_KEYUP )
     
         if ( (LOWORD(pMsg->wParam) & VK_CONTROL) == VK_CONTROL )
         
           SetSel(0, -1);
         
     
     return CEdit::PreTranslateMessage(pMsg);

【讨论】:

你是对的,我已经做到了。但我想知道/确定它不起作用的原因。 该函数在处理击键时应返回 TRUE。不返回 TRUE 可能会导致按键被处理两次。我也会使用 WM_KEYDOWN 而不是 KEYUP。加速器也在做同样的事情。 为什么这段代码会检查LOWORD(wParam) 中的VK_CONTROL 而忽略VK_A?此代码不能确保用户实际按下CTRL-A,而只是在CTRL 本身被释放时做出反应。我认为它需要是这样的:if ((pMsg->message == WM_KEYDOWN) && (pMsg->wParam == 'A') && (GetKeyState(VK_CONTROL) < 0)) SetSel(0, -1); return TRUE; else return CEdit::PreTranslateMessage(pMsg); @Remy,是的,我已经添加了支票。顺便说一句,如果我在WindowProc()而不是PreTranslateMessage()处理它会有什么问题吗?【参考方案2】:

原因可能是您拥有在主应用程序中定义的加速器。

这个加速器处理这个按键。

【讨论】:

以上是关于为啥 Ctrl + A 在 CEdit 中不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 SendInput Ctrl+V 在 Outlook 中不起作用?

为啥是 Ctrl+.当我将它绑定到 Emacs 中的命令时不起作用?

为啥 setter 的 'this._obj['a']=2' 在 Dart 类中不起作用

为啥复制功能在 setTimeout 中不起作用?

为啥非贪心量词有时在 Oracle 正则表达式中不起作用?

为啥我的链接颜色关键帧动画在 Chrome 中不起作用?