【发布时间】: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 将无法解决问题。有什么办法可以窃取焦点吗?
我尝试了以下组合:
SwitchToThisWindowSetWindowPosShowWindowSetForegroundWindow
但似乎无法弄清楚。
我认为这必须是可能的另一个原因是因为 Mac OSX 允许它使用 NSApplication activateIgnoringOtherApps: 并且 Linux 也允许它。我想要这个跨平台。
作为最后的手段,我打算使用HWND_TOPMOST 方法,然后是GetWindowRect,然后是SetCursorPos,然后单击位置0,0 的窗口,我真的不想这样做,因为可能是 0,0 的东西,它不应该被自动点击。
【问题讨论】:
-
为什么不尊重用户,尊重系统设计?如果用户正在输入文档并突然发现这些击键被传递到另一个窗口,他们将会被黑掉。击键可能会产生后果的一种。
-
嗯,所以您的研究表明,几乎没有人喜欢使用的操作系统可以做到这一点,所以它在 Windows 中也必须是可能的。很有说服力的论据。只需将问题的标题复制/粘贴到 Google 查询框中,答案就在第一页。
-
阅读documentation。您无法窃取焦点,除非其他应用允许您窃取焦点。这需要应用之间的合作。
-
我知道我不喜欢 Linux 或 OSX 发行版,但它是一个用户友好的功能。我的应用程序在倒计时后截屏。我不介意做些骇人听闻的事情,因为这完全对 usr 友好。这是用户期望和要求的行为。我知道在大多数情况下这是邪恶的,但您还能如何实现此功能?我能够启动专注于我的应用程序的 exe,因为在启动软件时它会窃取焦点,然后
SetForegroundWindow从那个到我的东西效果很好。我只是相信必须有一种编码方式,然后是 exe 或发送点击。 +代表所有你 -
奇怪的是你不会相信文档
标签: winapi