以编程方式控制C#窗体

以编程方式控制C#窗体,c#,.net,winforms,C#,.net,Winforms,我有一个我想通过编程控制的。幸运的是,该网站附带了一个与他们的驱动程序挂钩的应用程序。我能够编译并运行他们提供的示例代码,但是示例代码似乎生成了一个自定义GUI显示,仍然需要用户单击按钮等 我想要一个CLI,我可以运行,一切都将自动完成。然而,似乎没有一种简单的方法可以做到这一点。我偷看了一下DLL元数据,这就是我所看到的: namespace SA0314Ctrl { public class SA0314Ctrl : Component { public Li

我有一个我想通过编程控制的。幸运的是,该网站附带了一个与他们的驱动程序挂钩的应用程序。我能够编译并运行他们提供的示例代码,但是示例代码似乎生成了一个自定义GUI显示,仍然需要用户单击按钮等

我想要一个CLI,我可以运行,一切都将自动完成。然而,似乎没有一种简单的方法可以做到这一点。我偷看了一下DLL元数据,这就是我所看到的:

namespace SA0314Ctrl
{
    public class SA0314Ctrl : Component
    {
        public List<PointF> swpData;

        public SA0314Ctrl();
        public SA0314Ctrl(IContainer container);

        public event EventHandler OnDeviceRemoved;
        public event EventHandler OnDeviceReady;
        public event EventHandler OnDataAvailable;
        public event EventHandler OnSweepComplete;

        public byte GetBw();
        public string GetDeviceSn();
        public void ParseMessages(ref Message m);
        public void RegisterHandle(IntPtr Handle);
        public void SetBw(byte val);
        public void SetIfGain(byte val);
        public void StartSweep(double startFreq, double stepFreq, ushort numPts);
        public void StopSweep();
        public void SweepSingle(double startFreq, double stepFreq, ushort numPts);
        public bool UnregisterHandle();
        protected override void Dispose(bool disposing);
    }
}
名称空间SA0314Ctrl
{
公共类SA0314Ctrl:组件
{
公共列表swpData;
公共SA0314Ctrl();
公共SA0314Ctrl(IContainer容器);
公共事件事件处理程序OnDeviceRemoved;
公共事件处理程序OnDeviceReady;
公共事件事件处理程序可用;
公共事件处理程序已完成;
公共字节GetBw();
公共字符串GetDeviceSn();
公共消息(参考消息m);
公共无效登记手柄(IntPtr手柄);
公共无效SetBw(字节val);
公共无效设置增益(字节val);
公共无效启动排水(双启动要求、双步进频率、ushort numPts);
公共无效停止扫描();
公共无效扫描单(双启动请求、双步频率、ushort numPts);
公共bool UnregisterHandle();
受保护的覆盖无效处置(bool处置);
}
}
我尝试使用无参数构造函数,但是事件永远不会触发(如果我分配处理程序),并且实际的API都不起作用(它们都返回NullPointerException)。似乎我必须使用一个表单,这样我才能将
IContainer
传递给构造函数,并将
IntPtr
传递给
RegisterHandle
。但是我不想要一个需要有人点击的GUI!其全部目的是通过
StartSweep
StopSweep
自动收集频域测量值


是否可以创建一个表单,然后以编程方式钩住它,而不是等待用户输入?

您几乎肯定需要Application.Run()来触发这些事件。另一个需要它的组件的例子。这确实是问题所在。出于某种原因,我还必须调用
RegisterHandle(new IntPtr())
,但在这样做之后,CLI中的一切工作都与GUI中的工作一样!