为啥 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 中的命令时不起作用?