我有一个很奇怪的问题,以至于我几乎无法给它一个适当的标题。
简而言之:我有一个用 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 应用程序时,所有这些都不会发生。
有人吗?