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);
}
}