Process.GetCurrentProcess().Revit 的主窗口标题检索空字符串" "



我正在为 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 abriuo a20/09/2018 10:36:42 (ApplicationInitializedEventArgs)

如您所读到的,它没有像我希望的那样在txt文件"Autodesk Revit 2019 - [Home]"的单词"o"和"a"之间写。

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

如何通过为Process.GetCurrentProcess().MainWindowTitle分配名称来成功编写"Autodesk Revit 2019 - [主页]"?

稍后我想通过获取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 讨论中回答有关为字符串 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://learn.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演示模式的讨论的一些评论显示了如何访问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"。

最新更新