【问题标题】:SwitchToThisWindow sends current window to the backSwitchToThisWindow 将当前窗口发送到后面
【发布时间】:2011-02-02 07:37:12
【问题描述】:

所以是的,我发现自己处于执行SwitchToThisWindow 调用以强制我的窗口位于前面的可疑位置。我同意,这并不理想,但并不总是可以反对其他人认为必要的产品“功能”。

现在,我认为 SwitchToThisWindow 是对 AttachThreadInput 黑客进行强制窗口切换的胜利,因为它不太可能死锁,如果 SwitchToThisWindow 被删除或停止运行,我不会抱怨.

但是,SwitchToThisWindow 有一个不幸的副作用,即除了在为 fAltTab 参数传递 FALSE 时将目标窗口推到顶部之外,还将当前前景窗口推到 z 顺序的底部,并且不执行任何操作如果 TRUE 通过。

如何在不诉诸AttachThreadInput 的情况下避免这种“将当前活动推到 z 底部”的行为?

或者,MS 可以删除 AttachThreadInput 作为可行的解决方法,我可以告诉我的经理,这不可能,事实上,实际上,不可能。

【问题讨论】:

  • 我认为你不能简单地使用SetForegroundWindow?目前尚不清楚您需要实现哪些产品功能,除了将窗口放在前面。 SetForegroundWindow 甚至适用于附加到另一个线程的窗口,而不是您当前所在的线程,但它确实要求您的应用程序当前处于前台。我不知道这是否是个问题。
  • 这就是问题所在:即使用户有不同的应用程序处于活动状态,也会出现在前台。
  • 我明白了。您想成为 那些 应用程序之一。难怪您将您的职位描述为“不理想”。是否没有回旋余地以“正确”的方式做事并显示通知图标或吐司滑块?向你的老板展示:“Well-designed programs use the notification area appropriately, without being annoying or distracting.”:-)
  • 他读过。他不买。在我的支持下,我已经说服他们将其作为一个选项......也许默认情况下不会启用。基本上,一个竞争包可以做到这一点,我们必须竞争,显然是在缺陷和特性上:/

标签: windows winapi


【解决方案1】:

我不知道这是否有帮助,但我发现让我的窗口可靠地置顶的唯一方法是进行以下 2 次调用:

ShowWindow(myhwnd, SW_MINIMIZE);
ShowWindow(myhwnd, SW_RESTORE);

显然,这些调用只应在您的窗口当前不是最顶部的窗口时进行,以避免闪烁。但这也不应该有将当前前窗口带到 z 顺序底部的副作用。

【讨论】:

    【解决方案2】:

    当传递fAltTab=FALSE 时,您实际上是在模拟 Alt+Esc。所以你可以在SwitchToThisWindow 调用之后用SetWindowPos 和它的hWndInsertAfter 来扭转这个z 顺序变化,但是你又回到了丑陋的hacky 土地恕我直言。

    问题是,你真的需要键盘焦点吗?

    让我建议另一种选择:

    1. 如果您的窗口已最小化,请将其恢复
    2. 将您的窗口设置为最顶层,当您的窗口被激活时,再次删除该样式。
    3. 致电SetForegroundWindow 刷机任务栏按钮(或FlashWindowEx

    这应该避免用户在输入内容并最终在您的 UI 中执行某些操作而不看屏幕的情况。

    编辑:

    HWND hwndFgnd=GetForegroundWindow();
    SetWindowPos(hwnd,hwndFgnd,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE);
    SetWindowPos(hwndFgnd,hwnd,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE);
    

    ..如果您不想在任何时候设置最高位,则可能会起作用(即使您的窗口位于 z 顺序的顶部,您仍然无法通过 SetForegroundWindow 合法地获得焦点)

    【讨论】:

      【解决方案3】:

      这也是我面临的一个糟糕问题。请参阅我的解决方案here。它适用于Show()ShowDialog()

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多