【问题标题】:.NET + COM changed keyboard routing behavior.NET + COM 改变了键盘路由行为
【发布时间】:2010-10-08 02:35:02
【问题描述】:

我有一个很奇怪的问题,以至于我几乎无法给它一个合适的标题。

简而言之:我有一个用 MSVC++/MFC 编写的 COM 对象,带有一个从 CDialog 派生的对话框。在那个对话框中,我有三个子“用户控件”——从普通 CWnd 派生的窗口。

当我从不同的地方使用这个 COM 对象时,一切都按我的预期工作。但是当我从 C# 应用程序(.exe 文件)中使用它时,键盘的行为是不同的,或者我应该说坏了。

我的意思是:

  • 当我的任何“用户控件”获得焦点时按下的每个键都会从某处产生“错误哔声”,即使我尝试吞下 WM_KEYDOWN 消息
  • “用户控件”未收到 WM_CHAR / OnChar,尽管 Spy++ 表示已发布一个
  • 如果我在 OnKeyDown 和 OnChar 中首先放置一个 MessageBox,然后突然调用 OnChar 并且在显示位于 OnKeyDown 中的第一个 MessageBox 之前调用它
  • 我可以通过从 OnKeyDown 发布消息来克服 OnChar 没有被调用的问题,但我无法找到停止哔哔声的方法

与在非 .NET 应用程序中使用的 COM 对象对话框相比,这都是 CHANGED 行为。

我找到了一个我不完全满意的工作,所以如果有人能对这个问题有所了解,我会非常高兴! :-)

解决方法是这样的。而不是像这样创建我的“用户控件”:

m_mheSpell.CreateEx(
    WS_EX_CLIENTEDGE,
    NULL,
    "",
    WS_CHILD|WS_TABSTOP|WS_VISIBLE|WS_VSCROLL,
    4,18,340,100,
    GetSafeHwnd(), (HMENU)3000 );

我改成:

m_mheSpell.CreateEx(
    WS_EX_CLIENTEDGE,
    "Edit",  // <-- changed here
    "",
    WS_CHILD|WS_TABSTOP|WS_VISIBLE|WS_VSCROLL,
    4,18,340,100,
    GetSafeHwnd(), (HMENU)3000 );

然后我必须确保屏蔽键盘、鼠标和焦点消息,这样底层的编辑控件就不会干扰我。只是怕错过了屏蔽一些重要的消息,用户会在我自己发现之前发现一些意想不到的行为……

简而言之:“某事”(与周围的 .NET 环境相关)认为我的“CWnd 控件”无法进行键盘处理并与我混淆。从“编辑”派生使这个“东西”改变了它的想法。例如,当周围的进程是 VB6 应用程序时,所有这些都不会发生。

有人吗?

【问题讨论】:

    标签: .net com mfc keyboard cdialog


    【解决方案1】:

    啊,我现在可以回答我自己的问题了: WM_GETDLGCODE 叹息

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-06
      • 1970-01-01
      • 1970-01-01
      • 2017-03-30
      • 2020-07-17
      • 1970-01-01
      相关资源
      最近更新 更多