2013-06-28 117 views
0

我读过几种强制窗口在C#前台显示的方法,利用Win32的user32.dll。在Windows 8上设置前景窗口

这些工作完美,除了一个情况。 在Windows 8上,如果开始菜单或Windows应用商店应用位于前台,则这些将失败。

我只需要在开始菜单位于前景时进行此项工作。 有没有一种隐藏的方式来实现这一点?

+0

我可能是错的,但我相信你能得到这与http://msdn.microsoft.com/en-us/library/windows/desktop/ms633545(v=vs.85).aspx完成。问题是搜索窗口已经是最顶层的了,所以你需要获得该窗口的句柄并将其更改为zOrder,然后使用相同的函数将窗口设置为最顶层。 – Marco

+1

没有自己尝试,但我遇到了一些报告,它没有:http://stackoverflow.com/questions/15850230/setwindowpos-failing-to-bring-windows-to-front-in-windows- 8-when-windows-8-apps – dcastro

+0

我无法尝试它,要么我没有Windows 8,但你需要明白的是,所有的Windows 8窗口在最终构建使用GDI他们有正常的句柄和你可以像以前一样使用Win32函数,所以我相信这是值得你尝试的。 – Marco

回答

2
  DispatcherHelper.CheckBeginInvokeOnUI(async() => 
      { 
       try 
       { 
        if (!this.IsActive) 
        { 
         //pressing windows button 
         InputSimulator.SimulateKeyPress(VirtualKeyCode.LWIN); 
        } 
        await Task.Delay(1000); 

        ApplicationRunningHelper.GetCurrentProcessOnFocus(); 
       } 
       catch (Exception ex) 
       { 
       ... 
       } 
      }); 

public static class ApplicationRunningHelper 
    { 
     [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); 

     [DllImport("user32.dll", SetLastError = true)] 
     public static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId); 

     // When you don't want the ProcessId, use this overload and pass 
     // IntPtr.Zero for the second parameter 
     [DllImport("user32.dll")] 
     public static extern uint GetWindowThreadProcessId(IntPtr hWnd, IntPtr ProcessId); 

     [DllImport("kernel32.dll")] 
     public static extern uint GetCurrentThreadId(); 

     /// The GetForegroundWindow function returns a handle to the 
     /// foreground window. 
     [DllImport("user32.dll")] 
     public static extern IntPtr GetForegroundWindow(); 

     [DllImport("user32.dll")] 
     public static extern bool AttachThreadInput(uint idAttach, uint idAttachTo, bool fAttach); 

     [DllImport("user32.dll", SetLastError = true)] 
     public static extern bool BringWindowToTop(IntPtr hWnd); 

     [DllImport("user32.dll", SetLastError = true)] 
     public static extern bool BringWindowToTop(HandleRef hWnd); 

     [DllImport("user32.dll")] 
     public static extern bool ShowWindow(IntPtr hWnd, uint nCmdShow); 

     //one source 
     private static int SW_HIDE = 0; 
     private static int SW_SHOWNORMAL = 1; 
     private static int SW_SHOWMINIMIZED = 2; 
     private static int SW_SHOWMAXIMIZED = 3; 
     private static int SW_SHOWNOACTIVATE = 4; 
     private static int SW_RESTORE = 9; 
     private static int SW_SHOWDEFAULT = 10; 

     //other source 
     private static int SW_SHOW = 5; 

     /// <summary> 
     /// check if current process already running. if runnung, set focus to 
     /// existing process and returns true otherwise returns false. 
     /// </summary> 
     /// <returns></returns> 
     public static bool GetCurrentProcessOnFocus() 
     { 
      try 
      { 
       Process me = Process.GetCurrentProcess(); 
       Process[] arrProcesses = Process.GetProcessesByName(me.ProcessName); 
       IntPtr hWnd = arrProcesses[0].MainWindowHandle; 
       ForceForegroundWindow(hWnd); 
       return true; 
      } 
      catch (Exception) 
      { 
       return false; 
      } 
     } 

     public static void ForceForegroundWindow(IntPtr hWnd) 
     { 
      uint foreThread = GetWindowThreadProcessId(GetForegroundWindow(), IntPtr.Zero); 
      uint appThread = GetCurrentThreadId(); 
      const uint SW_SHOW = 5; 

      if (foreThread != appThread) 
      { 
       AttachThreadInput(foreThread, appThread, true); 
       BringWindowToTop(hWnd); 
       ShowWindow(hWnd, SW_SHOW); 
       AttachThreadInput(foreThread, appThread, false); 
      } 
      else 
      { 
       BringWindowToTop(hWnd); 
       ShowWindow(hWnd, SW_SHOW); 
      } 
     } 
    } 
+1

你做了我的一天。 – GenericTeaCup