【问题标题】:Steal focus as SetForegroundWindow can't do it窃取焦点,因为 SetForegroundWindow 无法做到
【发布时间】:2015-08-16 06:41:40
【问题描述】:

我知道这听起来很邪恶,但我的意图根本不是这个。

用户点击了“延迟拍摄”并开始倒计时,在此期间他们会关注另一个应用程序,然后在倒计时后用户希望我的应用程序重新获得焦点。

SetForegroundWindow 从 PID X 的应用程序运行而 PID Y 的应用程序聚焦时失败。

这使我的窗口向前移动,但它没有获得焦点:

SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);

它将窗口设置为始终位于顶部。但是焦点没有放在我的窗口中。然后将其设置回HWND_NOTOPMOST 将其保留在那里,即使它不是最重要的,但它仍然没有焦点。在这些对SetWindowPos 的调用之后运行SetForegroundWindow 将无法解决问题。有什么办法可以窃取焦点吗?

我尝试了以下组合:

  • SwitchToThisWindow
  • SetWindowPos
  • ShowWindow
  • SetForegroundWindow

但似乎无法弄清楚。

我认为这必须是可能的另一个原因是因为 Mac OSX 允许它使用 NSApplication activateIgnoringOtherApps: 并且 Linux 也允许它。我想要这个跨平台。

作为最后的手段,我打算使用HWND_TOPMOST 方法,然后是GetWindowRect,然后是SetCursorPos,然后单击位置0,0 的窗口,我真的不想这样做,因为可能是 0,0 的东西,它不应该被自动点击。

【问题讨论】:

  • 为什么不尊重用户,尊重系统设计?如果用户正在输入文档并突然发现这些击键被传递到另一个窗口,他们将会被黑掉。击键可能会产生后果的一种。
  • 嗯,所以您的研究表明,几乎没有人喜欢使用的操作系统可以做到这一点,所以它在 Windows 中也必须是可能的。很有说服力的论据。只需将问题的标题复制/粘贴到 Google 查询框中,答案就在第一页。
  • 阅读documentation。您无法窃取焦点,除非其他应用允许您窃取焦点。这需要应用之间的合作。
  • 我知道我不喜欢 Linux 或 OSX 发行版,但它是一个用户友好的功能。我的应用程序在倒计时后截屏。我不介意做些骇人听闻的事情,因为这完全对 usr 友好。这是用户期望和要求的行为。我知道在大多数情况下这是邪恶的,但您还能如何实现此功能?我能够启动专注于我的应用程序的 exe,因为在启动软件时它会窃取焦点,然后 SetForegroundWindow 从那个到我的东西效果很好。我只是相信必须有一种编码方式,然后是 exe 或发送点击。 +代表所有你
  • 奇怪的是你不会相信文档

标签: winapi


【解决方案1】:

无论前台是什么应用程序(如任务管理器等),这始终有效:

AllocConsole(); 
auto hWndConsole = GetConsoleWindow();
SetWindowPos(hWndConsole, 0, 0, 0, 0, 0, SWP_NOZORDER);
FreeConsole();
SetForegroundWindow(hWnd);

【讨论】:

  • 我还没有尝试过,但这看起来可行。非常酷的解决方案,我接受了!
【解决方案2】:

正如评论所说,SetForegroundWindow 有时是故意无用的。基本上,有两种方法可以绕过限制:

  • 模拟键盘/鼠标
  • 获取权限

有一些更聪明的魔法可以在不直接单击要激活的窗口的情况下实现目标。由于我对GUI不熟悉,建议直接将代码注入当前前台窗口,然后将前台权限交出。

另外还有一些模拟的例子。

http://www.codeproject.com/Tips/76427/How-to-bring-window-to-top-with-SetForegroundWindo.aspx

【讨论】:

    猜你喜欢
    • 2016-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-04
    • 1970-01-01
    • 1970-01-01
    • 2020-11-07
    • 1970-01-01
    相关资源
    最近更新 更多