提问人:Michael 提问时间:11/6/2023 最后编辑:Michael 更新时间:11/13/2023 访问量:89
在 VB6 中禁用自动停用 .NET ActiveX 控件的最佳实践?
Best Practice for disable automatically deactivating .NET ActiveX Controls in VB6?
问:
我正在移植一个旧的 Visual Basic 6 程序。我在 WPF 中部署了迁移的组件,并将该组件作为 ActiveX 控件(C#、Windows 窗体、.NET Framework)提供,以便在 VB6 应用程序中临时添加控件(将移植过程分解为更小的部分)。
如果将外部 ActiveX 控件添加到 VB6 中,则效果很好,例如
Private Sub Form_Load()
Set mCtrl = Controls.Add("ActiveX_Control.UserControl1", "UserControl1", Me)
Set mActiveX = mCtrl.object
mCtrl.Visible = True
End Sub
但是,如果我将控件添加到容器中(Picture1 = 图片框),则该控件将自动停用(如果 .NET 控件失去焦点):
Private Sub Form_Load()
Set mCtrl = Controls.Add("ActiveX_Control.UserControl1", "UserControl1", Picture1)
Set mActiveX = mCtrl.object
mCtrl.Visible = True
End Sub
我了解到接口 IOleInPlaceObject 负责这种行为。此外,有关 C# 接口 ICustomQueryInterface。 因此,我使用以下知识在运行时抑制接口:
public CustomQueryInterfaceResult GetInterface(ref Guid iid, out IntPtr ppv)
{
if (iid == typeof(IOleInPlaceObject).GUID)
{
ppv = IntPtr.Zero;
return CustomQueryInterfaceResult.Failed;
}
ppv = IntPtr.Zero;
return CustomQueryInterfaceResult.NotHandled;
}
这似乎有效,但新的问题是,如果按 Tab 键(VB6 中 ActiveX 控件之前的最后一个控件),ActiveX 控件不会自动获得焦点。
这是正确的方法吗? 有没有更好的方法?也许通过ActiveX控件的IOleObject::GetMiscStatus的不同返回值?
可以在此处下载示例 C# 和 VB6 项目。
答: 暂无答案
评论