我如何强制我的应用程序来到前面,并把重点放在?

我正在开发一个应用程序,这个应用程序恰好是我正在开发的安装程序的引导程序。 应用程序进行一些MSI调用,以获取我需要的信息,这些信息是我的应用程序主窗口的向导,这会在收集信息时导致打开进度窗口,然后在完成后离开。 然后向导build立并启动。 我的问题是,该向导(从CPropertySheet派生)不希望来到前面,并成为活动的应用程序没有我添加一些调用这样做。

我已经解决了在我的OnInitDialog()方法中使用下面的代码将它带到前面的问题:

SetWindowPos(&wndTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); // force window to top SetWindowPos(&wndNoTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); // lose the topmost status that the previous line gave us 

我的问题是,我还没有想出如何使窗口自激活(即使自己成为焦点)。 SetFocus()在此上下文中不起作用。 我需要一些强制窗口到Z-order的顶端并激活它,最好是尽可能less的调用。

我的猜测是MSI调用在开始时打开的进度窗口导致主窗口搞砸了,但是我无法阻止窗口出现。 另外,隐藏它是没有意义的,因为它让用户在主窗口到达之前知道发生了什么。

安德鲁并不完全正确。 Windows确实很难阻止你窃取焦点,但可以使用下面的方法。

  1. 附加到当前具有焦点的窗口的线程。
  2. 把你的窗口聚焦。
  3. 从线程分离。

而代码将会是这样的:

 DWORD dwCurrentThread = GetCurrentThreadId(); DWORD dwFGThread = GetWindowThreadProcessId(GetForegroundWindow(), NULL); AttachThreadInput(dwCurrentThread, dwFGThread, TRUE); // Possible actions you may wan to bring the window into focus. SetForegroundWindow(hwnd); SetCapture(hwnd); SetFocus(hwnd); SetActiveWindow(hwnd); EnableWindow(hwnd, TRUE); AttachThreadInput(dwCurrentThread, dwFGThread, FALSE); 

您可能需要也可能不需要使用管理权限来运行程序,但是我已经亲自使用了这些代码,并且已经完成了工作。

你不能偷窃重点。 期。

看到这个旧新的文章:

https://blogs.msdn.microsoft.com/oldnewthing/20090220-00/?p=19083

不ShowWindow(youwindow,SW_SHOWNORMAL)的工作? -don

你会发现BringWindowToTop或SetForegroundWindow具有必须满足的要求,在这个窗口实际上被迫在所有其他窗口(应用程序)的前面。 如果这些不符合,Windows将只会在任务栏中闪烁应用程序的图标。 本文提供了一种解决方法,但是1800年的信息指出,这是不推荐的。 我想你只能接受它。