Revit的Process.GetCurrentProcess()。MainWindowTitle检索空字符串“”

时间:2018-09-20 11:34:18

标签: c# revit-api

我正在为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 2018年9月20日10:36:42(ApplicationInitializedEventArgs)

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

如果我在Process.GetCurrentProcess().MainWindowTitle上直接写了Trace.WriteLine,我会得到“ 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];

任何帮助都将得到感谢!

3 个答案:

答案 0 :(得分:3)

正如我建议在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 );

调试器很好!

实际上非常宝贵。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

case ADDED

声明每个字符串名称后,我通过在第一个私有方法中包含每个定义来获得应用程序名称“ Autodesk Revit 2019”,该方法是在打开Revit应用程序时创建的,用于注册。这必须在方法内部完成,因为只有在应用程序启动后,我们才可以访问MainWindowTitle。这就是为什么在尝试启动应用程序开始时,但在应用程序尚未完全启动并因此打开带有这样的Title的窗口时,尝试获取MainWindowTitle时得到空字符串“”的原因。

string originalString;
string[] splittedString;
string AppName;

并且以后可以在需要时使用相同的字符串,因为它已在方法外部声明,例如,在这里我需要再次写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"); } 检索我想要的内容:“ Autodesk Revit 2019”。