c++ - 如何将我的窗口投影为前台的事件窗口

标签 c++ windows winapi windows-7 mfc

打开了一些窗口,在我的流程中,我想再启动一个窗口(高优先级),用户必须在其中输入凭据。我想把这个凭据窗口放在前台,反过来它可能会给用户带来很好的体验,因为他不需要手动选择凭据窗口。这是一次性启动,绝对不烦人,但用户必须输入信用。

实现此目标的最佳方法是什么?我不认为模拟鼠标点击是个好主意。有没有办法将消息发送到其余窗口以使其失去焦点?这样当我启动我的窗口时,它就会出现在前台。

最佳答案

这对我有用,无需使用 SetWindowPos 使窗口“始终在最前面”:

HWND foreGround = GetForegroundWindow();
if (foreGround != m_hWnd)
{
    if (!::SetForegroundWindow(m_hWnd))
    {
        if (!foreGround)
        {
            foreGround = FindWindow(_T("Shell_TrayWnd"), NULL);
        }

        DWORD idForeground = GetWindowThreadProcessId(foreGround, NULL);
        DWORD idTarget = GetWindowThreadProcessId(m_hWnd, NULL);

        AttachThreadInput(idForeground, idTarget, TRUE);

        ::SetForegroundWindow(m_hWnd);

        AttachThreadInput(idForeground, idTarget, FALSE);
    }

    BringWindowToTop();
}

我在聊天应用程序中使用它,因此新的聊天消息可以转移焦点(显然是可选的,因为有些用户不喜欢这样。)

关于c++ - 如何将我的窗口投影为前台的事件窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5814524/

相关文章:

c++ - 以编程方式设置标题栏和边框颜色

c - 子类化控件时如何处理控件的通知?比如EN_CHANGE?

c++ - NetShareEnum (..) winapi 无法删除不必要的共享文件夹

c++ - gradle请参阅model.components.binaries.all的输出

c++ - 在 Linux 上启动文件的默认应用程序

c++ - 序列化和反序列化 uint64_t - 不同平台上的不同结果

c++ - Win32 : Is there a difference between Dr. Watson 的完整/小型转储并编写我自己的?

windows - Delphi项目的自动化构建工具

c# - 事件窗口上的 Windows 系统事件是否已更改?

windows - 如何在 Windows 命令行中执行 for 循环?