gpt4 book ai didi

c++ - 如何强制我的应用程序出现在最前面并获得焦点?

转载 作者:可可西里 更新时间:2023-11-01 13:00:27 29 4
gpt4 key购买 nike

我正在开发一个应用程序,它恰好是我也在开发的安装程序的 Bootstrap 。该应用程序进行了几次 MSI 调用以获取我需要的信息,以便将我的应用程序主窗口的向导放在一起,这会导致在收集信息时打开一个进度窗口,然后在完成后消失。然后设置并启动向导。我的问题是向导(派生自 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 顺序的顶部并激活它,最好是在尽可能少的调用中。

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

最佳答案

Andrew 并不完全正确。 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);

你可能需要也可能不需要以管理权限运行你的程序才能工作,但我个人使用过这段代码并且它已经完成了工作。

关于c++ - 如何强制我的应用程序出现在最前面并获得焦点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/688337/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com