为什么System.Diagnostic.Process在使用Windows任务栏图标切换应用程序时抛出异常?

时间:2015-02-28 07:04:11

标签: c# .net winforms windows-8.1

我目前正在开发一款应用程序,该应用程序使用System.Diagnostics.Process来获取当前活动应用程序的窗口标题或ForeGround上的应用程序。现在,这很好,并使用我当前的代码,直到我遇到这个问题。如果我使用任务栏图标而不是应用程序窗口的最小化按钮切换我的应用程序,则会出现NullReferenceException

编辑: 如果我不提高这一点,可能会让人感到困惑。所以基本上NullReferenceException是由(title.Equals(System.Diagnostics.Process.GetCurrentProcess().MainWindowTitle))

引起的 由于

标题变量为空

String title = GetActiveWindowTitle();

GetActiveWindowTitle()返回null。这使用Window.GetForegroundWindow();由于某些原因使用任务栏图标切换,此Window.GetForegroundWindow();方法不返回任何内容。

enter image description here

enter image description here

最初我用过这个

[DllImport("user32.dll")]
public static extern IntPtr GetForegroundWindow();

获得我需要的东西。但是在使用任务栏图标切换应用时,我仍然遇到同样的问题。使用此代码的唯一区别是异常就是这个 A first chance exception of type 'System.ComponentModel.Win32Exception' occurred in System.dll

我的操作系统是Windows 8.1。

非常感谢任何投入。

更新 @KcDoD的答案有点正确。由于NullReferenceException实际上是我问题的一部分,我将其标记为答案。它还指导了我很多东西,弄清楚发生了什么。

基本上,在我的应用程序中,我在GetActiveWindowTitle()中调用此方法WinEventProc(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime)。 WinEventProc()是一种在切换窗口时触发的委托方法。事实证明,通过调用GetForegroundWindow();GetActiveWindowTitle()进程尚未激活,这就是为什么当它获取Active应用程序或进程时它给出/返回null。

祝你好运

1 个答案:

答案 0 :(得分:0)

您的问题与您尝试与MainWindowTitle等同的字符串有关。这意味着title变量/字段。

在尝试使用tite之前,您应该null检查Equal

此外:这是一个使用here

答案的程序
  static void Main(string[] args)
  {
      String answ;

      while (true)
      {
           answ = GetActiveWindowTitle();
           if (answ == null)
           {
               Console.WriteLine("NO active program");
           }
           else {
              Console.WriteLine(answ);
           }
        Thread.Sleep(1000);
       }

 }


 [DllImport("user32.dll")]
 static extern IntPtr GetForegroundWindow();

 [DllImport("user32.dll")]
 static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count);

 static private string GetActiveWindowTitle()
 {
    const int nChars = 256;
    StringBuilder Buff = new StringBuilder(nChars);
    IntPtr handle = GetForegroundWindow();

    if (GetWindowText(handle, Buff, nChars) > 0)
    {
        return Buff.ToString();
     }
     return null;
  }

答案:如果没有选择进程,则返回null。我认为这是你问题的答案。