获取可以运行Windows窗体控件的应用程序。

5
我正在开发一个Autocad插件,使用Windows Forms没有问题。我创建了一个用户控件(winforms),以便将来可以在任何形式中复制它。问题是,从控件的代码中,如何获取运行该控件的应用程序实例?这可能是一个纯WinForms问题。
条件是,在插件中,我可以轻松获取Autocad应用程序实例。用户控件意味着在单独的程序集(dll)中,以便在插件应用程序中引用它,因此它无法直接访问应用程序实例。
有一个主要程序集作为Autocad插件运行。该程序集已经实例化了Autocad应用程序。现在我有一些与Autocad一起使用的有用窗体控件,在单独的程序集中。(这是因为我想在我喜欢的许多不同插件中使用它们)。所以,Autocad运行主程序集,并运行单独程序集的控件。
为了正常工作,这些控件需要访问运行主程序集的Autocad应用程序。今天,我在控件中将应用程序作为属性使用,必须在使用之前设置它们。(如果我忘记设置它,就会出现异常)。由于我不能使用带参数的创作者来创建控件。我希望控件能够检测其运行的应用程序,以便避免这种解决方法。

我不确定为什么您想要应用程序的实例。也许,如果您能简要解释一下您的情况,那会有所帮助。System.Windows.Forms.Application类公开了一些静态方法,可能对您有所帮助。在这种情况下,请查看http://msdn.microsoft.com/en-us/library/system.windows.forms.application(v=vs.100).aspx。 - Jatin
加入场景。 - Daniel Möller
我认为Autocad api不会给你访问底层Windows应用程序对象的权限。在开发wpf应用程序时,我遇到了类似的问题。最终我创建了一个应用程序,就像这篇文章中所示 - https://dev59.com/CmvXa4cB1Zd3GeqPKI3D。如果您的屏幕不与AutoCAD屏幕交互,则可以尝试类似的方法。 - Jatin
我可以轻松获取Autocad应用程序,而且我不需要Autocad才能访问Windows应用程序。我需要控制来访问Autocad。可能有一些方法可以找到正在运行控件的应用程序。 - Daniel Möller
你正在寻找 Control.FindForm 方法吗?http://msdn.microsoft.com/library/system.windows.forms.control.findform.aspx - Simon Mourier
很好。已经完成了一半的工作。我想知道是否还能找到一些 Form.FindApplication 或者 Form.FindRunningAssembly.FindCallingAssembly - Daniel Möller
1个回答

2
请看下面的代码。
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;

假设TestForm在一个外部程序集(dll)中声明,而不是这个插件的程序集。而且TestForm需要使用Autodesk....Application实例。从你展示的代码中,我可以创建类似于independent1.AcadApp = AcadAppInstance的东西。好的。 - Daniel Möller
但是,我想要的是TestForm本身找到应用程序。我的意思是从TestForm代码内部。所以,它会像independent1.GetAcadApplicationRunningMe()这样独立。当然,它将在内部使用,因为外部我可以轻松地获取应用程序。 - Daniel Möller
我现在无法进行测试,但稍后会查看。我可以在UserControl内部使用System.Windows.Forms.Application吗?请注意,我没有显式的Winforms应用程序,我只有两个库。一个是插件,调用另一个包含控件的库。 - Daniel Möller
我认为在任何UserControl中使用System.Windows.Forms.Application应该没有问题。上述代码是在AutoCAD插件(dll,而不是Windows Forms项目)中使用的,所以在您的情况下也应该可以工作。您将无法在UserControl中存储Application实例,但实际上您并不需要这样做。System.Windows.Forms.Application可以在任何地方用于执行应用程序级任务。 - Jatin
嗯......我在想是否可以在控件内部也使用 Autodesk....Application - Daniel Möller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接