【问题标题】:A message box that never loses focus永远不会失去焦点的消息框
【发布时间】:2021-04-15 05:06:15
【问题描述】:

使用

创建的消息框
MessageBox (NULL, "Text", "Title", MB_ICONINFORMATION | MB_SYSTEMMODAL);

停留在其他窗口的顶部,但是当用户单击另一个窗口时它会失去键盘焦点。 如何创建一个永远不会失去键盘焦点的消息框(或编辑框或对话框),所以如果我尝试使用 [ALT-TAB] 或鼠标或任何其他方法切换到另一个窗口,或者如果另一个应用程序正在运行在后台打开自己的编辑框,键盘焦点会跳回我的消息/编辑框吗? 标准的 MessageBox 函数没有这样的选项,所以我尝试了一个自定义的编辑框。我尝试了 WM_SETFOCUS、WM_KILLFOCUS、WM_NCACTIVATE、SetForegroundWindow、SetFocus,但到目前为止没有运气。当我打开另一个窗口时,键盘焦点顽固地转到那个窗口。

【问题讨论】:

    标签: c++ windows dialog messagebox editbox


    【解决方案1】:
    RegisterHotKey(0,1,MOD_ALT,VK_TAB); //disables alt+tab until message box returns
    SetTimer(hwnd,1,100,0); //0.1 sec is enough for message box window creation
    MessageBox(0,"Text","Title",MB_ICONINFORMATION|MB_SYSTEMMODAL); //since it's system modal, main message loop will wait for it to return
    ClipCursor(0); //frees cursor
    UnregisterHotKey(0,1); //enables alt+tab again
    

    这里我们使用计时器来剪辑光标,这样用户就无法在消息框之外点击。我将消息框的标题部分留在了剪辑区域之外,因为单击那里会取消光标剪辑。

    case WM_TIMER:
    {
        KillTimer(hwnd,1);
        RECT rc;
        GetWindowRect(FindWindow(0,"Title"),&rc);
        rc.top+=22; //title area left out of clip area
        ClipCursor(&rc); //user cannot move their mouse outside of the message box
        break;
    }
    

    然而,这不能阻止 Ctrl + Alt + Del 而是按你的要求做。

    【讨论】:

    • @xcvbnm AFAIK,如果您的应用程序的顶级窗口失去 foreground 状态,您将无法在程序中再次使其成为前台。更改前景窗口的授权应用程序是具有 foreground 窗口本身的应用程序。所以问题不应该是“如何重新获得焦点”IMO,你应该保证你永远不会失去焦点。因此,您应该摆脱所有可能窃取注意力的可能性。您可以搜索 setting hooks 以获取有关禁用按键组合的更多信息。
    • 与其使用计时器,不如使用线程本地挂钩来在 MessageBox 的窗口创建/可见时得到通知。
    • @xcvbnm "无论如何都需要键盘焦点留在我的窗口上" 只是说,但如果 Windows 允许应用程序这样做(可靠)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 1970-01-01
    • 2017-09-10
    • 1970-01-01
    • 1970-01-01
    • 2013-10-02
    • 1970-01-01
    相关资源
    最近更新 更多