1

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

简而言之:我有一个用 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 应用程序时,所有这些都不会发生。

有人吗?

4

1 回答 1

1

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

于 2009-02-17T19:00:19.323 回答