是否可以告诉 Scintilla 忽略某些击键并将它们传递给父窗口?

Posted

技术标签:

【中文标题】是否可以告诉 Scintilla 忽略某些击键并将它们传递给父窗口?【英文标题】:Is it possible to tell Scintilla to ignore certain keystrokes and pass them to the parent window? 【发布时间】:2009-12-30 20:57:40 【问题描述】:

我希望 Scintilla 忽略某些组合键,例如 Ctrl+Enter 或 Ctrl+D,并在输入它们时通知父窗口。我通读了文档,但无法弄清楚如何做到这一点。这可能吗?

【问题讨论】:

在 LIVEditor 中,我在按键事件到达编辑器之前拦截它们。 【参考方案1】:

好吧,如果一切都失败了,你可以继承 Scintilla 控件的窗口过程。拦截 WM_KEYDOWN 和 WM_KEYUP 消息,过滤它们,然后将它们传递给主 Scintilla 窗口 proc 或您的父窗口是相当简单的。

【讨论】:

我使用我在以下文章中找到的信息快速测试了这种方法:aaronballman.com/programming/REALbasic/…。它似乎工作正常。我投票给你,如果几天后没有得到更以 Scintilla 为中心的答案,我会接受这个。谢谢。 是的,我在文档中也找不到任何好的东西。祝你好运。【参考方案2】:

真的有两种选择。正如建议的那样,连接到WM_KEYDOWN 就是其中之一。另一种是使用快捷键表(参见http://msdn.microsoft.com/en-us/library/ms645526(VS.85).aspx)将按键转换为更高级别的命令ID,并在WM_COMMAND处理程序中处理命令ID。

使用加速器表无疑是“正确”的方式,但WM_KEYDOWN 似乎也能正常工作,并且不需要更改消息循环代码/跟踪需要覆盖的魔术框架函数/等等.

(如果使用MFC,窗口特定加速器表的魔术框架函数是CWnd::PreTranslateMessage。覆盖它,在那里调用TranslateAccelerator(传入构造函数中加载的加速器表/OnCreate/etc .) 并返回 FALSE -- 如果 TranslateAccelerator 返回 0 -- 或 TRUE -- 如果它返回其他值。这允许使用特定于 Scintilla 窗口的键盘快捷键。)

顺便说一句,这两种方法共存得非常愉快,所以有些按键可以用加速键处理,有些可以用WM_KEYDOWN处理。我上一个 Scintilla 程序就是这样做的;恐怕我完全不记得为什么了,但它确实工作得很好。

【讨论】:

如果您使用对话框(即使用 DialogBoxParam),我强烈建议使用挂钩方法而不是加速器,因为将加速器注入消息泵比挂钩窗口更复杂。

以上是关于是否可以告诉 Scintilla 忽略某些击键并将它们传递给父窗口?的主要内容,如果未能解决你的问题,请参考以下文章

如何修复“忽略的击键”

如何告诉 cppcheck 忽略某些错误?

忽略某些路由上的过期令牌

忽略某些路由上的过期令牌

《Windows程序设计》读书笔六 键盘

获取当前行号?