2009-02-17 67 views
1

我有一个很奇怪的问题,我几乎无法给它一个足够的标题。.NET + COM改变了键盘布线行为

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

当我从不同的地方使用这个COM对象时,我的期望就会发生。但是当我从C#应用程序(.exe文件)使用它时,键盘行为是不同的,或者我应该说是坏了。

由不同我的意思是:

  • 当我的任何“用户控制”已经聚焦产生从什么地方“错误提示音”,即使我尝试吞下WM_KEYDOWN消息中的每个键按下
  • 没有WM_CHAR/OnChar被“用户控件”接收,虽然Spy ++说如果我在OnKeyDown和OnChar中首先放置一个MessageBox,那么突然OnChar被调用,并且它在第一个位于MessageBox之前被调用显示OnKeyDown
  • I可以克服缺乏OnChar的张贴,从onkeydown事件信息获取调用,但我不能想出一个办法来阻止

这是正在从non-.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); 

,然后我必须确保街区键盘,鼠标及焦点消息,以便底层编辑控制不会搅乱我。我只是担心,我会错过阻止一些重要的信息,用户会发现一些意外的行为,然后我自己找到它...

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

有人?

回答

1

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