使ActiveX控件在没有窗体的情况下工作?
我们正在使用黄玉签名垫。他们提供他们的API来自将要放在Winform控件上的ActiveX控件。那么,我们的项目的工作方式,我们不希望有一个形式(至少不可见)。我们只想让签名的ActiveX控件在后台获取图像。使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 of type 'System.Windows.Forms.AxHost+InvalidActiveXStateException' was thrown.
我该怎么做才能解决这个问题?创建一个新的隐藏表单并将控件放在它上面以便隐藏它会更容易吗?
事实上,它结束了,黄玉提供了一个ActiveX控件和一个.NET包装。我切换到.Net包装,它不需要被放置在窗体或任何东西。我会留下这个问题,因为如果不是那个封装器我真的在处理它。
您可能可以直接使用COM对象(它确实取决于它们如何实现控件)。通常,当您将COM对象导入到引用中时,它将创建一个包装器AxHost,但它也应该导入基本类对象。找到那个只是创建它作为任何普通的类,不要使用AxHost版本。如果似乎没有任何基类对象,则可以使用Activator以及控件的CLSID或ProgID创建对象。喜欢的东西:
object o = Activator.CreateInstance(Type.GetTypeFromProgID("prog.id"))
是,不能以这种方式工作。 AxHost包装器需要在可用之前创建Handle。这要求它是调用Show()方法的窗体上的子控件。
您通常会从ActiveX控件获取两个互操作封装,一个AxBlah.dll包含AxHost包装器和一个包装COM接口的Blah.dll。你只需要引用Blah.dll。这样做是否是一个悬而未决的问题,许多ActiveX控件都需要一个窗口句柄来处理线程同步。
如果这样做不起作用,您需要一个主机窗体。你可以把它无形将此代码粘贴到窗体类:
protected override void SetVisibleCore(bool value) {
if (!IsHandleCreated) CreateHandle();
value = false;
base.SetVisibleCore(value);
}
你必须调用Application.Run()泵消息循环。
这是我做的(基本上都添加了无形的斧控制,然后调用它的方法):
using (AxRUNNERXLib.AxRunnerX crm = new AxRUNNERXLib.AxRunnerX()) {
Controls.Add (crm);
crm.Visible = false;
crm.CustomerPrefix = m_SelCall.CustomerPrefix;
crm.LoadDefaultDescription();
crm.SearchByID (m_SelCall.CustomerID);
crm.OperatorID = Form1.operatorID.ToString();
crm.ShowHistory();
Controls.Remove (crm);
}
在我的公司,我们想建立一个类似的过程,但捕捉指纹代替签名。我们使用IDGem LCD 1x5阅读器来捕获指纹。它看起来像只有可用的指纹识别器API是ActiveX控件(SigID.ocx),但在他们的网站上看到.NET包装。指纹识别器是否有专门的方法? – 2011-10-12 22:58:35