C# 获取运行Windows窗体控件的应用程序

C# 获取运行Windows窗体控件的应用程序,c#,winforms,autocad-plugin,C#,Winforms,Autocad Plugin,我正在制作一个Autocad插件,它使用Windows窗体 我已经创建了一个用户控件(winforms),将来可以以我喜欢的任何形式进行复制 问题是 从控件的代码中,如何获取运行该控件的应用程序实例 (可能是纯winforms问题) 条款: 在插件中,我可以获得Autocad应用程序实例,而无需 问题 此用户控件位于插件应用程序中引用的独立程序集(dll)中,因此它无法直接访问应用程序实例 关于该场景的一点解释: 有一个主部件作为插件由Autocad运行。 该部件已实例化Autocad应用程序

我正在制作一个
Autocad插件
,它使用
Windows窗体
我已经创建了一个
用户控件(winforms)
,将来可以以我喜欢的任何形式进行复制

问题是

从控件的代码中,如何获取运行该控件的应用程序实例

(可能是纯winforms问题)

条款:

在插件中,我可以获得Autocad应用程序实例,而无需 问题

此用户控件位于插件应用程序中引用的
独立程序集(dll)
中,因此它无法直接访问应用程序实例


关于该场景的一点解释:

有一个
主部件
作为插件由Autocad运行。 该部件已实例化Autocad应用程序

现在,我有一些有用的表单控件可以与Autocad一起使用,它们位于
单独的部件中。(这是因为我想在我喜欢的不同插件中使用它们)

因此,Autocad运行
主部件
,而
主部件
运行
独立部件
的控件

为了正常工作,这些控件需要访问运行
主部件的Autocad应用程序

今天,我将应用程序用作控件中的一个属性,在使用它们之前必须设置该属性。(如果我忘记设置,则会引发异常)。因为我不能有一个创建者接受参数的控件


我希望控件能够检测其正在运行的应用程序,从而避免这种解决方法。

请参阅以下代码

public class MyCommands {

    [CommandMethod("NS", "TEST", "TEST", CommandFlags.Modal)]
    public void TestCommand() // This method can have any name
    {
        Form fromAutoCADAPI = new TestForm();
        Form independent1 = new TestForm();
        Form independent2 = new TestForm();

        //Using AutoCAD application
        Autodesk.AutoCAD.ApplicationServices.Application.ShowModelessDialog(fromAutoCADAPI);

        independent1.Show();
        independent2.Show();

        //Using Windows Forms Application
        var count = System.Windows.Forms.Application.OpenForms.Count; //should be 3

        Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog(count.ToString());

    }
}
如果这是您已经知道的,那么您可能应该粘贴一些示例代码,这将有助于理解您在代码中的具体位置。这是我使用AutoCAD应用程序和Windows窗体应用程序的方式。若您不想获取WPF应用程序,那个么您可以使用

var application = System.Windows.Application.Current;

我不确定您为什么需要应用程序实例。也许,如果你能简单地解释一下你的情况,那会有所帮助。System.Windows.Forms.Application类公开可能对您有帮助的静态方法。“在这种情况下,看看它是怎么回事,”补充说,“我认为Autocad api不允许您访问底层的windows应用程序对象。我在开发wpf应用程序时遇到过类似的问题。我最终创建了一个应用程序,如本文所示-。如果您的屏幕不与AutoCAD屏幕交互,则可以尝试类似的方法。我可以毫无问题地获取AutoCAD应用程序,并且不需要AutoCAD就可以访问windows应用程序。我需要控件才能访问Autocad。可能有某种方法可以找到运行控件的应用程序。是否正在查找control.FindForm方法?假设
TestForm
是在一个外部程序集(dll)中声明的,它不是这个插件的程序集。TestForm需要使用Autodesk….Application
实例。根据您展示的代码,我可以制作类似于
independent1.AcadApp=AcadAppInstance
。好的,但是我想要的是TestForm
本身
来查找应用程序。我的意思是
从内部测试表单代码
。因此,它就像一个
独立的1.GetAcadApplicationRunningMe()
。当然,它会在内部使用,因为在外部我可以很容易地接受应用程序。我现在不能测试,但我会在以后再看。我可以从
UserControl
内部使用
System.Windows.Forms.Application
吗?请注意,我没有显式的Winforms应用程序。我只有两个图书馆。一个是插件,它调用另一个包含控件的插件。我认为在任何用户控件中使用System.Windows.Forms.Application应该没有问题。上面的代码是在AutoCAD插件(dll,而不是Windows窗体项目)中使用的,因此它也应该适用于您的场景。您将无法在UserControl中存储应用程序实例,但实际上您不必这样做。System.Windows.Forms.Application可以在任何地方用于执行应用程序级任务。嗯……我想知道是否可以在控件内部使用
Autodesk….Application
。。。