键盘不能使用CPropertyPage中的ActiveX

时间:2013-11-14 09:37:02

标签: activex

在我的示例项目(c ++ vs10)中,我在对话框中放置了一个ActiveX控件(用作PropertyPage)。 Dialog连接到名为CTestPage的CPropertyPage派生类。如果我打开一个带有DoModal的PropertySheet,其中添加了CTestPage,则会出现ActiveX控件,但我无法通过键盘处理它。如果我单击ActiveX控件(例如Calendar Control 8.0),控件将收到单击并正常工作。但控件不会处理键盘敲击。我在我的开发者机器上测试了十个不同的ActiveX控件 - >总是一样的行为。 如果我将ActiveX控件放在普通的Dialog中,一切正常。

任何提示我做错了什么?

非常感谢 heribert

PS。是的,在InitInstance中调用AfxEnableControlContainer。

1 个答案:

答案 0 :(得分:0)

一个PropertyPage向每个要检出的控件发送WM_GETDLGCODE,控件可以处理哪个键盘输入。 我已经测试了所有的ActiveX控件,结果为0,作为请求的答案!很酷,所以没有人会收到任何键盘输入。 我将使用的ActiveX控件是由c#编写的。需要ActiveX层来为c ++提供复杂的c#控件。 但是底层的复杂c#控件也会在WM_GETDLGCODE消息上返回0。 所以我将c#控件子类化为以下代码,现在它工作正常!!

internal class SubclassedComplexControl : ComplexControl
{
    [SecurityPermission(SecurityAction.LinkDemand,
     Flags = SecurityPermissionFlag.UnmanagedCode)]
     protected override void WndProc(ref System.Windows.Forms.Message m)
     {
        const int WM_GETDLGCODE = 0x0087;
        const int DLGC_WANTARROWS = 0x0001;
        const int DLGC_WANTALLKEYS = 0x0004;
        const int DLGC_WANTCHARS = 0x0080;
        const int VK_ESCAPE = 0x1B;
        const int VK_RETURN = 0x0D;


        if (m.Msg == WM_GETDLGCODE)
        {
            if (m.WParam.ToInt32() == VK_RETURN || m.WParam.ToInt32() == VK_ESCAPE)
                m.Result = (IntPtr) DLGC_WANTALLKEYS;
            else
                m.Result = (IntPtr)(DLGC_WANTARROWS | DLGC_WANTCHARS);
            return;
        }
        base.WndProc(ref m);
     }
 }