<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: How to get UIApplication from IExternalApplication in Revit API Forum</title>
    <link>https://forums.autodesk.com/t5/revit-api-forum/how-to-get-uiapplication-from-iexternalapplication/m-p/13261780#M65274</link>
    <description>&lt;P&gt;Actually you can access the internal &lt;STRONG&gt;UIApplication&lt;/STRONG&gt; inside the &lt;STRONG&gt;UIControlledApplication&lt;/STRONG&gt; using some reflation. So you don't need to wait for the event.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;LI-CODE lang="csharp"&gt;public Result OnStartup(UIControlledApplication application)
{
    UIApplication uiapp = application.GetUIApplication();
    string userName = uiapp.Application.Username;
    return Result.Succeeded;
}&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Here is the extension code.&lt;/P&gt;&lt;LI-CODE lang="csharp"&gt;/// &amp;lt;summary&amp;gt;
/// Get &amp;lt;see cref="Autodesk.Revit.UI.UIApplication"/&amp;gt; using the &amp;lt;paramref name="application"/&amp;gt;
/// &amp;lt;/summary&amp;gt;
/// &amp;lt;param name="application"&amp;gt;Revit UIApplication&amp;lt;/param&amp;gt;
public static UIApplication GetUIApplication(this UIControlledApplication application)
{
    var type = typeof(UIControlledApplication);

    var propertie = type.GetFields(BindingFlags.Instance | BindingFlags.NonPublic)
        .FirstOrDefault(e =&amp;gt; e.FieldType == typeof(UIApplication));

    return propertie?.GetValue(application) as UIApplication;
}&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;You can find the whole file extension below with the extension to convert &lt;STRONG&gt;UIApplication&lt;/STRONG&gt; to &lt;STRONG&gt;UIControlledApplication&lt;/STRONG&gt; as well.&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;&lt;A href="https://github.com/ricaun-io/ricaun.Revit.DI/blob/master/ricaun.Revit.DI/Extensions/UIControlledApplicationExtension.cs" target="_blank"&gt;https://github.com/ricaun-io/ricaun.Revit.DI/blob/master/ricaun.Revit.DI/Extensions/UIControlledApplicationExtension.cs&lt;/A&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Wed, 15 Jan 2025 10:29:28 GMT</pubDate>
    <dc:creator>ricaun</dc:creator>
    <dc:date>2025-01-15T10:29:28Z</dc:date>
    <item>
      <title>How to get UIApplication from IExternalApplication</title>
      <link>https://forums.autodesk.com/t5/revit-api-forum/how-to-get-uiapplication-from-iexternalapplication/m-p/6355729#M65269</link>
      <description>&lt;P&gt;Hi!&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Following this&amp;nbsp;&lt;A href="http://thebuildingcoder.typepad.com/blog/2015/03/element-selection-changed-event.html" target="_self"&gt;post&lt;/A&gt;&amp;nbsp;i tried to implement it &amp;nbsp;in an External Application as they suggested. However i don't understand how i can get the UIApplication from the UIControllApplication. After some googling this seems impossible, instead one is supposed to get it from the "object sender" in the PanelEvent class. When debugging the code it shows PanelEvent class object sender type to be RvtRibbonTab, which when cast to Application returns null and cant thus be used to create an UIApplication. What am I missing?&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 30 May 2016 12:38:53 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/revit-api-forum/how-to-get-uiapplication-from-iexternalapplication/m-p/6355729#M65269</guid>
      <dc:creator>cedemax</dc:creator>
      <dc:date>2016-05-30T12:38:53Z</dc:date>
    </item>
    <item>
      <title>Re: How to get UIApplication from IExternalApplication</title>
      <link>https://forums.autodesk.com/t5/revit-api-forum/how-to-get-uiapplication-from-iexternalapplication/m-p/6356181#M65270</link>
      <description>&lt;P&gt;You should use the idle event.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Try the following code and if it satisfies your needs don't forget to mark the rply as an answer:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;#region Namespaces

using System;
using System.Text;
using System.Linq;
using System.Xml;
using System.Reflection;
using System.ComponentModel;
using System.Collections;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Media.Imaging;
using System.Windows.Forms;
using System.IO;

using Autodesk.Revit.ApplicationServices;
using Autodesk.Revit.Attributes;

using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Events;
using Autodesk.Revit.DB.Architecture;
using Autodesk.Revit.DB.Structure;
using Autodesk.Revit.DB.Mechanical;
using Autodesk.Revit.DB.Electrical;
using Autodesk.Revit.DB.Plumbing;

using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Selection;
using Autodesk.Revit.UI.Events;

//using Autodesk.Revit.Collections;
using Autodesk.Revit.Exceptions;
using Autodesk.Revit.Utility;

using RvtApplication = Autodesk.Revit.ApplicationServices.Application;
using RvtDocument = Autodesk.Revit.DB.Document;

#endregion

namespace RevitAddinCS2
{
    [Transaction(TransactionMode.Manual)] 
    [Regeneration(RegenerationOption.Manual)] 
    public class ExtApp : IExternalApplication
    {
        #region Cached Variables

        public static UIControlledApplication _cachedUiCtrApp;
        #endregion

        #region IExternalApplication Members

        public Result OnStartup(UIControlledApplication uiCtrlApp)
        {
            _cachedUiCtrApp = uiCtrlApp;

            try
            {
                //TODO: add you code below.
                _cachedUiCtrApp.Idling += OnIdling;

                return Result.Succeeded;
            }
            catch (Exception ex)
            {
                MessageBox.Show( ex.ToString() );
                return Result.Failed;
            }
        }

        private void OnIdling(object sender, IdlingEventArgs e)
        {
            _cachedUiCtrApp.Idling -= OnIdling;

            UIApplication uiapp = sender as UIApplication;

            if (uiapp != null)
            {
                UIDocument uidoc = uiapp.ActiveUIDocument;
                Document doc = uidoc.Document;
            }
        }

        public Result OnShutdown(UIControlledApplication uiApp)
        {
            try
            {
                //TODO: add you code below.


                return Result.Succeeded;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
                return Result.Failed;
            }
        }

        #endregion

    }
}
&lt;/PRE&gt;</description>
      <pubDate>Mon, 30 May 2016 17:59:00 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/revit-api-forum/how-to-get-uiapplication-from-iexternalapplication/m-p/6356181#M65270</guid>
      <dc:creator>Mustafa.Salaheldin</dc:creator>
      <dc:date>2016-05-30T17:59:00Z</dc:date>
    </item>
    <item>
      <title>Re: How to get UIApplication from IExternalApplication</title>
      <link>https://forums.autodesk.com/t5/revit-api-forum/how-to-get-uiapplication-from-iexternalapplication/m-p/6356686#M65271</link>
      <description>&lt;P&gt;Thank you! This was exactly what i wanted. I added the UIApplication as another cached variable in order to access it from the other event. Thank you again!&lt;/P&gt;</description>
      <pubDate>Tue, 31 May 2016 06:24:46 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/revit-api-forum/how-to-get-uiapplication-from-iexternalapplication/m-p/6356686#M65271</guid>
      <dc:creator>cedemax</dc:creator>
      <dc:date>2016-05-31T06:24:46Z</dc:date>
    </item>
    <item>
      <title>Re: How to get UIApplication from IExternalApplication</title>
      <link>https://forums.autodesk.com/t5/revit-api-forum/how-to-get-uiapplication-from-iexternalapplication/m-p/7838921#M65272</link>
      <description>&lt;P&gt;Can you do this for the Failure Handling Event?&amp;nbsp; I keep getting a null reference for the uiapp when trying to get this from the Failure Handling event.&amp;nbsp; When debugging the sender appears to be an ApplicationServices.Application object.&lt;/P&gt;&lt;PRE&gt;void ControlledApplication_FailuresProcessing(object sender, Autodesk.Revit.DB.Events.FailuresProcessingEventArgs e)
        {
            List&amp;lt;ElementId&amp;gt; oFailedElements = new List&amp;lt;ElementId&amp;gt;();
            UIApplication uiapp = sender as UIApplication;

            //My Failure Handling Code is here.
        }&lt;/PRE&gt;</description>
      <pubDate>Thu, 08 Mar 2018 18:14:57 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/revit-api-forum/how-to-get-uiapplication-from-iexternalapplication/m-p/7838921#M65272</guid>
      <dc:creator>Anonymous</dc:creator>
      <dc:date>2018-03-08T18:14:57Z</dc:date>
    </item>
    <item>
      <title>Re: How to get UIApplication from IExternalApplication</title>
      <link>https://forums.autodesk.com/t5/revit-api-forum/how-to-get-uiapplication-from-iexternalapplication/m-p/13261519#M65273</link>
      <description>&lt;P&gt;Try some :&lt;/P&gt;
&lt;LI-CODE lang="csharp"&gt; public Result OnStartup(UIControlledApplication application)
    {
        application.ControlledApplication.ApplicationInitialized  += test;
    }

    private void test(object sender, ApplicationInitializedEventArgs e)
    {
        if (sender is Application application)
        {
            var uiApp = new UIApplication(application);
            // something 
        }
    }&lt;/LI-CODE&gt;</description>
      <pubDate>Wed, 15 Jan 2025 07:34:24 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/revit-api-forum/how-to-get-uiapplication-from-iexternalapplication/m-p/13261519#M65273</guid>
      <dc:creator>Chuong.Ho</dc:creator>
      <dc:date>2025-01-15T07:34:24Z</dc:date>
    </item>
    <item>
      <title>Re: How to get UIApplication from IExternalApplication</title>
      <link>https://forums.autodesk.com/t5/revit-api-forum/how-to-get-uiapplication-from-iexternalapplication/m-p/13261780#M65274</link>
      <description>&lt;P&gt;Actually you can access the internal &lt;STRONG&gt;UIApplication&lt;/STRONG&gt; inside the &lt;STRONG&gt;UIControlledApplication&lt;/STRONG&gt; using some reflation. So you don't need to wait for the event.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;LI-CODE lang="csharp"&gt;public Result OnStartup(UIControlledApplication application)
{
    UIApplication uiapp = application.GetUIApplication();
    string userName = uiapp.Application.Username;
    return Result.Succeeded;
}&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Here is the extension code.&lt;/P&gt;&lt;LI-CODE lang="csharp"&gt;/// &amp;lt;summary&amp;gt;
/// Get &amp;lt;see cref="Autodesk.Revit.UI.UIApplication"/&amp;gt; using the &amp;lt;paramref name="application"/&amp;gt;
/// &amp;lt;/summary&amp;gt;
/// &amp;lt;param name="application"&amp;gt;Revit UIApplication&amp;lt;/param&amp;gt;
public static UIApplication GetUIApplication(this UIControlledApplication application)
{
    var type = typeof(UIControlledApplication);

    var propertie = type.GetFields(BindingFlags.Instance | BindingFlags.NonPublic)
        .FirstOrDefault(e =&amp;gt; e.FieldType == typeof(UIApplication));

    return propertie?.GetValue(application) as UIApplication;
}&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;You can find the whole file extension below with the extension to convert &lt;STRONG&gt;UIApplication&lt;/STRONG&gt; to &lt;STRONG&gt;UIControlledApplication&lt;/STRONG&gt; as well.&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;&lt;A href="https://github.com/ricaun-io/ricaun.Revit.DI/blob/master/ricaun.Revit.DI/Extensions/UIControlledApplicationExtension.cs" target="_blank"&gt;https://github.com/ricaun-io/ricaun.Revit.DI/blob/master/ricaun.Revit.DI/Extensions/UIControlledApplicationExtension.cs&lt;/A&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 15 Jan 2025 10:29:28 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/revit-api-forum/how-to-get-uiapplication-from-iexternalapplication/m-p/13261780#M65274</guid>
      <dc:creator>ricaun</dc:creator>
      <dc:date>2025-01-15T10:29:28Z</dc:date>
    </item>
    <item>
      <title>Re: How to get UIApplication from IExternalApplication</title>
      <link>https://forums.autodesk.com/t5/revit-api-forum/how-to-get-uiapplication-from-iexternalapplication/m-p/13263760#M65275</link>
      <description>&lt;P&gt;&lt;a href="https://forums.autodesk.com/t5/user/viewprofilepage/user-id/4176855"&gt;@ricaun&lt;/a&gt; , that is awesome solution. &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 16 Jan 2025 06:16:33 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/revit-api-forum/how-to-get-uiapplication-from-iexternalapplication/m-p/13263760#M65275</guid>
      <dc:creator>Chuong.Ho</dc:creator>
      <dc:date>2025-01-16T06:16:33Z</dc:date>
    </item>
  </channel>
</rss>

