首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Process.GetCurrentProcess().MainWindowTitle检索空字符串"“

Process.GetCurrentProcess().MainWindowTitle检索空字符串"“
EN

Stack Overflow用户
提问于 2018-09-20 11:34:18
回答 3查看 339关注 0票数 2

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

对于每次发生事件,都会在txt文件上写入一行,告诉我有关该事件的信息,例如:

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

通过获取应用程序的MainWindowTitle名称(如:Process.GetCurrentProcess().MainWindowTitle ),我将获得“AutoDeskRevit2019”(应用程序名称)

代码语言:javascript
复制
public static string originalString = Process.GetCurrentProcess().MainWindowTitle;

(...)

代码语言:javascript
复制
Trace.WriteLine("O utilizador " + Environment.UserName + " abriu o " + originalString + " a " + DateTime.Now + " (ApplicationInitializedEventArgs)");

它写入txt文件:

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

正如你所读的,它没有写在txt文件"Autodesk Revit 2019 - Home“之间的单词"o”和"a“之间,正如我所希望的那样。

如果我将Process.GetCurrentProcess().MainWindowTitle直接写在Trace.WriteLine上,我会得到“AutoDeskRevit2019- Home",但我希望写一个指定的名称。

如何通过给Process.GetCurrentProcess().MainWindowTitle指定一个名称来成功地编写"Autodesk Revit 2019 - Home“

稍后,我想通过使用Autodesk Revit 2019来获得这个名称,如下所示:

代码语言:javascript
复制
public static string originalString = Process.GetCurrentProcess().MainWindowTitle;

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

public static string AppName = splittedString[0];

任何帮助都会得到认可!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-11-05 14:13:45

为了能够将主窗口标题存储在string类型的名称中,我必须首先声明我正在使用的方法的每个:

代码语言:javascript
复制
string originalString;
string[] splittedString;
string AppName;

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

代码语言:javascript
复制
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

代码语言:javascript
复制
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检索了我想要的内容:“AutoDeskRevit2019”。

票数 0
EN

Stack Overflow用户

发布于 2018-09-21 06:07:59

正如我建议在Revit讨论论坛上回答您关于为字符串C#分配名称的类似问题一样,我将查看调试器中一步一步执行的代码。

然后你就可以亲眼看到到底是怎么回事了。

还可以添加更多中间行和变量,以达到绝对清晰的目的:

代码语言:javascript
复制
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 );

调试器很好!

事实上是无价的。

票数 3
EN

Stack Overflow用户

发布于 2018-10-02 13:45:45

关于如何使用确定Revit演示模式的讨论中的一些注释显示了如何访问Revit主窗口标题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52424242

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档