.NET+;COM更改了键盘路由行为

.NET+;COM更改了键盘路由行为,.net,com,mfc,keyboard,cdialog,.net,Com,Mfc,Keyboard,Cdialog,我有一个非常奇怪的问题,我几乎不能给它一个适当的标题 简而言之:我用MSVC++/MFC编写了COM对象,其中有一个从CDialog派生的对话框。在这个对话框中,我有三个子“用户控件”——从普通CWnd派生的窗口 当我从不同的地方使用这个COM对象时,一切都如我所期望的那样工作。但是当我从C#应用程序(.exe文件)中使用它时,键盘行为是不同的,或者说是坏的 我所说的不同是指: 当我的任何“用户控件”具有焦点时,按下的每个键都会从某处发出“错误蜂鸣”,即使我试图吞下WM_KEYDOWN消息 “

我有一个非常奇怪的问题,我几乎不能给它一个适当的标题

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

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

我所说的不同是指:

  • 当我的任何“用户控件”具有焦点时,按下的每个键都会从某处发出“错误蜂鸣”,即使我试图吞下WM_KEYDOWN消息
  • “用户控件”没有收到WM_CHAR/OnChar,尽管Spy++说已经发布了一个
  • 如果我先在OnKeyDown和OnChar中放置一个MessageBox,然后突然调用OnChar,并在显示OnKeyDown中第一个MessageBox之前调用它
  • 我可以通过发布OnKeyDown的消息来克服OnChar没有被呼叫的缺点,但我无法找到一种方法来停止嘟嘟声
与非.NET应用程序中使用的COM对象对话框相比,这些行为都有所改变

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

工作是这样的。而不是像这样创建我的“用户控件”:

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 );
m_mheSpell.CreateEx(
前客户,

“编辑”,啊,我现在可以回答我自己的问题了: WM_GETDLGCODE

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