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);
}
}
}
我可能是错的,但我相信你能得到这与http://msdn.microsoft.com/en-us/library/windows/desktop/ms633545(v=vs.85).aspx完成。问题是搜索窗口已经是最顶层的了,所以你需要获得该窗口的句柄并将其更改为zOrder,然后使用相同的函数将窗口设置为最顶层。 – Marco
没有自己尝试,但我遇到了一些报告,它没有:http://stackoverflow.com/questions/15850230/setwindowpos-failing-to-bring-windows-to-front-in-windows- 8-when-windows-8-apps – dcastro
我无法尝试它,要么我没有Windows 8,但你需要明白的是,所有的Windows 8窗口在最终构建使用GDI他们有正常的句柄和你可以像以前一样使用Win32函数,所以我相信这是值得你尝试的。 – Marco