c# - 让 ActiveX 控件在没有窗体的情况下工作?

标签 c# winforms activex axhost topaz-signatures

我们使用的是黄 Jade 签名垫。他们以 ActiveX 控件的形式提供 API,该控件将放在 Winform 控件上。好吧,我们项目的工作方式我们不希望有一个表单(至少不可见)。我们只希望签名 ActiveX 控件在后台获取图像。

static AxSigPlus sig = new AxSIGPLUSLib.AxSigPlus();

public static void Begin()
{
    ((System.ComponentModel.ISupportInitialize)(sig)).BeginInit();
    sig.Name = "sig";
    sig.Location = new System.Drawing.Point(0, 0);
    sig.Size = new System.Drawing.Size(0, 0);
    sig.Enabled = true;

    sig.TabletState = 1; //error here
    sig.SigCompressionMode = 0;
}

好的,所以我在标记的行收到了一个错误。异常(exception)是

Exception of type 'System.Windows.Forms.AxHost+InvalidActiveXStateException' was thrown.

我该怎么做才能解决这个问题?创建一个新的隐藏窗体并将控件置于其上以使其不可见会更容易吗?

最佳答案

是的,这样不行。 AxHost 包装器需要在可用之前创建其句柄。这要求它是调用 Show() 方法的窗体上的子控件。

您通常会从 ActiveX 控件获得两个互操作包装器,一个包含 AxHost 包装器的 AxBlah.dll 和一个包装 COM 接口(interface)的 Blah.dll。您只需要引用 Blah.dll。这是否有效是一个悬而未决的问题,许多 ActiveX 控件需要一个窗口句柄来处理线程同步。

如果这不奏效,您将需要一个主持人表格。您可以通过将此代码粘贴到表单类中来使其不可见:

    protected override void SetVisibleCore(bool value) {
        if (!IsHandleCreated) CreateHandle();
        value = false;
        base.SetVisibleCore(value);
    }

您必须调用 Application.Run() 来启动消息循环。

关于c# - 让 ActiveX 控件在没有窗体的情况下工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2907438/

相关文章:

c# - 如何使用通配符搜索参数化?

asp.net - 如何使用 javascript 抑制 IE7 ActiveX 消息?

c# - 有没有一种可靠的方法可以使用 C# 将焦点激活/设置到窗口?

C#创建类实例时执行类内的方法

c# - 在运行时向窗体添加 C# 标签

c# - 自动调整 SplitContainer 面板的大小

registry - Active X 选项的哪些注册表项?

c# - 为什么我从 C# 应用程序调用 VB6 ActiveX DLL 失败并返回 "No such interface supported"?

c# - 使用 Func 的责任链

c# - JQuery 中的自动完成