【问题标题】:Process.GetCurrentProcess().MainWindowTitle of Revit retrieves empty string ""Revit 的 Process.GetCurrentProcess().MainWindowTitle 检索空字符串“”
【发布时间】:2018-09-20 11:34:18
【问题描述】:

我正在为 Revit 创建一个在其应用程序中注册多个事件的插件。

每次发生事件时,都会在 txt 文件中写入一行,告诉我该事件,例如:

用户在 Autodesk Revit 2019 上打开了一个文档 (...)

我通过获取应用程序的 MainWindowTitle 名称来获取“Autodesk Revit 2019”(应用程序名称),如下所示:Process.GetCurrentProcess().MainWindowTitle

public static string originalString = Process.GetCurrentProcess().MainWindowTitle;

(...)

Trace.WriteLine("O utilizador " + Environment.UserName + " abriu o " + originalString + " a " + DateTime.Now + " (ApplicationInitializedEventArgs)");

txt文件里面写的是:

O utilizador rita.aguiar abriu o a 20/09/2018 10:36:42 (ApplicationInitializedEventArgs)

如您所见,它并没有像我希望的那样在“o”和“a”之间写在 txt 文件“Autodesk Revit 2019 - [Home]”上。

如果我直接在Trace.WriteLine 上写Process.GetCurrentProcess().MainWindowTitle,我会得到“Autodesk Revit 2019 - [Home]”,但我希望写一个指定的名称。

如何通过为Process.GetCurrentProcess().MainWindowTitle指定名称来成功编写“Autodesk Revit 2019 - [Home]”?

稍后我想通过像这样仅获得 Autodesk Revit 2019 来获得此名称:

public static string originalString = Process.GetCurrentProcess().MainWindowTitle;

public static string[] splittedString = originalString.Split("-".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);

public static string AppName = splittedString[0];

任何帮助将不胜感激!

【问题讨论】:

    标签: c# revit-api


    【解决方案1】:

    正如我建议在 Revit API 讨论论坛中回答您在 assigning a name to a string C# 上的类似问题一样,我将在调试器中逐步查看代码执行。

    然后你就可以亲眼看到到底发生了什么。

    为了绝对清晰,您还可以添加更多中间行和变量:

    string originalString = Process
      .GetCurrentProcess()
      .MainWindowTitle;
    
    string s2 = "O utilizador " 
      + Environment.UserName 
      + " abriu um documento no " 
      + originalString + " a " + DateTime.Now;
    
    //or use string interpolation: 
    //https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/tokens/interpolated
    string s3 = $"O utilizador {Environment.UserName} abriu um documento no {originalString} a {DateTime.Now}";
    
    Trace.WriteLine( s2 );
    Trace.WriteLine( s3 );
    

    调试器不错!

    事实上,无价之宝。

    【讨论】:

    • 谢谢,我不知道字符串的插值,我也试试。
    • 很遗憾我还没有解决这个问题。然而,这个问题与使用 Process.GetCurrentProcess().MainWindowTitle 有关,它没有检索到我所期望的。
    • 也许使用 JtWindowHandle 的 Building Coder 示例会有所帮助。他们肯定会在 Revit-2019 之前的版本中访问主 Revit 窗口。 In Revit 2019, things have changed.
    【解决方案2】:

    关于如何determine Revit demo mode 的讨论中的一些 cmets 显示了如何访问 Revit 主窗口标题。

    【讨论】:

      【解决方案3】:

      为了能够以字符串类型的名称存储主窗口标题,我必须首先在我正在使用的方法之外声明每个字符串:

      string originalString;
      string[] splittedString;
      string AppName;
      

      在声明每个字符串名称后,我通过在第一个私有方法中包含每个定义来获得应用程序名称“Autodesk Revit 2019”,该私有方法是在打开 Revit 应用程序时注册的。这必须在一个方法中完成,因为只有在应用程序启动后我们才能访问 MainWindowTitle。这就是为什么我在应用程序开始启动时尝试获取 MainWindowTitle 时得到一个空字符串“”的原因,但在它完全启动并因此打开了一个具有此类标题的窗口之前。

      private void DumpEventArgs(ApplicationInitializedEventArgs args_initialized) 
      {
          originalString = Process.GetCurrentProcess().MainWindowTitle;
          splittedString = originalString.Split(new[] { " -" }, StringSplitOptions.RemoveEmptyEntries);
          AppName = splittedString[0];
      
          //StreamWriter file = new StreamWriter("C://Users//" + Environment.UserName + "//AppData//Roaming//Autodesk//" + Environment.UserName + ".txt", append: true);
          //MessageBox.Show($"O utilizador {Environment.UserName} iniciou o {AppName} a {DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")}");
          file.WriteLine($"{Environment.UserName},{DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")},{AppName},iniciar");
      }
      

      我可以稍后在需要时使用相同的字符串,因为它已在方法外部声明,例如这里我需要再次编写AppName

      private void DumpEventArgs(DocumentSavedEventArgs args_saved)
          {
              //StreamWriter file = new StreamWriter("C://Users//" + Environment.UserName + "//AppData//Roaming//Autodesk//" + Environment.UserName + ".txt", append: true);
              //MessageBox.Show($"O utilizador {Environment.UserName} guardou um documento no {AppName} a {DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")}");
              file.WriteLine($"{Environment.UserName},{DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")},{AppName},guardar");
          }
      

      最后AppName 检索到我想要的:“Autodesk Revit 2019”。

      【讨论】:

        猜你喜欢
        • 2014-08-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-04
        • 1970-01-01
        • 2018-11-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多