如何防止Windows桌面热键引起关注

如何防止Windows桌面热键引起关注,windows,winapi,Windows,Winapi,我尝试创建一个程序,将活动窗口放在屏幕的左上角。我当前使用并移动它 当我打开我的Windows资源管理器并双击我的程序时,这项功能就会起作用。然后,它将资源管理器移到左上角 问题是:如何使用热键。我试图将程序的链接放在桌面上,然后为其指定快捷方式,例如Ctrl+Shift+1。 当我现在打开Windows资源管理器并使用热键时,资源管理器不会移动,它会失去焦点。热键似乎会运行程序(程序本身不会创建窗口),并使其成为前景窗口 我如何实现我想要的,我的程序是否有办法不聚焦(如果是这样的话),或者是否

我尝试创建一个程序,将活动窗口放在屏幕的左上角。我当前使用并移动它

当我打开我的Windows资源管理器并双击我的程序时,这项功能就会起作用。然后,它将资源管理器移到左上角

问题是:如何使用热键。我试图将程序的链接放在桌面上,然后为其指定快捷方式,例如Ctrl+Shift+1。 当我现在打开Windows资源管理器并使用热键时,资源管理器不会移动,它会失去焦点。热键似乎会运行程序(程序本身不会创建窗口),并使其成为前景窗口


我如何实现我想要的,我的程序是否有办法不聚焦(如果是这样的话),或者是否可以通过Win API找到以前活动的窗口?

GetForegroundWindow
允许返回NULL

我建议您实际创建一个1x1像素的小窗口,然后在激活该窗口时将其隐藏并在一个小循环中等待(超时),直到
getforegroundindow
返回其他内容

由于任务栏和其他shell窗口可以具有焦点,因此您应该通过验证返回的HWND是否至少具有
WS\u标题
WS\u可见
样式(而不是
WS\u最小化
)来确保它看起来像一个“正常”窗口


如果您想处理前景窗口不是“正常”应用程序窗口的情况,您可以返回使用以找到合适的窗口,但在检查样式时需要更加严格。您不希望在始终位于顶部的工具窗口等上执行操作。

这是有效的,创建一个窗口,然后使用ShowWindow将其最小化,将焦点放在按下热键时处于活动状态的窗口上。无需轮询前景窗口。可以注册通知。总结一下:您的问题是,您正在通过创建快捷方式并为其分配热键来实现热键。按热键可使Shell启动快捷方式引用的进程。这最终会导致前台线程发生更改。解决方案:不要使用快捷方式实现热键。改用专用API。