C# Process.GetCurrentProcess().Revit的MainWindowTitle检索空字符串&引用;

C# Process.GetCurrentProcess().Revit的MainWindowTitle检索空字符串&引用;,c#,revit-api,C#,Revit Api,我正在为Revit创建一个插件,用于在其应用程序中注册多个事件 每次发生事件时,都会在txt文件上写一行,告诉我事件的情况,例如: 用户在Autodesk Revit 2019上打开了一个文档(…) 我通过获取应用程序的MainWindowTitle名称获得“Autodesk Revit 2019”(应用程序名称),如下所示:Process.GetCurrentProcess().MainWindowTitle public static string originalString = Proc

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

每次发生事件时,都会在txt文件上写一行,告诉我事件的情况,例如:

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

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

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

在txt文件中写入以下内容:

O utilizador rita.aguiar abriuO a20/09/2018 10:36:42(应用程序初始目标)

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

如果我直接在
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];

欢迎任何帮助

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

然后你就能亲眼看到到底发生了什么

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

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 );
调试器很好


事实上,这是非常宝贵的。

关于如何显示如何访问Revit主窗口标题的讨论中的一些评论。

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

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”。

谢谢,我不知道字符串的插值,我也会尝试。不幸的是,我还无法解决此问题。然而,这个问题与使用Process.GetCurrentProcess().MainWindowTitle有关,它无法检索到我所期望的内容。也许使用
JtWindowHandle
的构建编码器示例会有所帮助。在Revit-2019之前的版本中,他们肯定可以访问主Revit窗口。
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");
    }