2015-09-23 36 views
1

我从类库打开WPF窗口。如何从类库中检查WPF窗口是否已经打开?到System.Windows.Application.Current.Windows任何引用产生此错误:如何从类库检查WPF窗口是否打开

Object reference not set to an instance of an object

注:我从一个WPF项目,我改变了输出类型类库创建的类库。

+0

窗口是否在同一个过程中?如果你只想显示窗口的一个实例,你有没有考虑过把它变成单例? – vesan

+0

我没有看单身人士,并会这样做。感谢您的建议。我也改变了我的设计,使我不需要使用WPF窗口,而是使用WinForm。我没有任何麻烦检查winform的实例。 – GlxyM31

回答

0

我试图引用System.Windows但无法这样做。

但是强制执行一个只有一个进程实例正在运行的规则是一个有趣的任务。在Win32上还有很多其他的编码算法。它会检测您的应用程序是否已经运行。如果检测到,它会将该应用程序放到前台(如果它被最小化)。

using System.Diagnostics; 
using System.Runtime.InteropServices; 
public class OnlyOneWindow 
{ 
    [DllImport("user32.dll")] private static extern 
     bool SetForegroundWindow(IntPtr hWnd); 
    [DllImport("user32.dll")] private static extern 
     bool ShowWindowAsync(IntPtr hWnd, int nCmdShow); 
    [DllImport("user32.dll")] private static extern 
     bool IsIconic(IntPtr hWnd); 

    private const int SW_HIDE = 0; 
    private const int SW_SHOWNORMAL = 1; 
    private const int SW_SHOWMINIMIZED = 2; 
    private const int SW_SHOWMAXIMIZED = 3; 
    private const int SW_SHOWNOACTIVATE = 4; 
    private const int SW_RESTORE = 9; 
    private const int SW_SHOWDEFAULT = 10; 

    public OnlyOneWindow() 
    { 
     // get the name of our process 
     string proc=Process.GetCurrentProcess().ProcessName; 
     // get the list of all processes by that name 
     Process[] processes=Process.GetProcessesByName(proc); 
     // if there is more than one process... 
     if (processes.Length > 1) 
     { 
      // Assume there is our process, which we will terminate, 
      // and the other process, which we want to bring to the 
      // foreground. This assumes there are only two processes 
      // in the processes array, and we need to find out which 
      // one is NOT us. 

      // get our process 
      Process p=Process.GetCurrentProcess(); 
      int n=0;  // assume the other process is at index 0 
      // if this process id is OUR process ID... 
      if (processes[0].Id==p.Id) 
      { 
       // then the other process is at index 1 
       n=1; 
      } 
      // get the window handle 
      IntPtr hWnd=processes[n].MainWindowHandle; 
      // if iconic, we need to restore the window 
      if (IsIconic(hWnd)) 
      { 
       ShowWindowAsync(hWnd, SW_RESTORE); 
      } 
      // bring it to the foreground 
      SetForegroundWindow(hWnd); 
      // exit our process 
      return; 
     } 
     // ... continue with your application initialization here. 
    } 
}