DeferWindowPos和SWP_SHOWWINDOW / SWP_HIDEWINDOW

时间:2010-05-19 14:04:44

标签: c++ windows winapi

我正在编写一个使用DeferWindowPos API函数的虚拟桌面应用程序。我正在使用的当前方法是将窗口移出屏幕,如果它们不在当前的虚拟桌面上。但是我知道也希望隐藏屏幕外的窗口,这样它们就不会出现在任务栏上。我也尝试过将SWP_SHOWWINDOW / SWP_HIDEWINDOW传递给DeferWindowPos()调用。我已经阅读了一些关于此的网站,其中一个建议如果传递了SWP_SHOWWINDOW / SWP_HIDEWINDOW,那么窗口将只显示或隐藏,并且没有重新定位。任何人都可以证实这一点,或者我做错了什么?

3 个答案:

答案 0 :(得分:0)

您需要阅读明确说明

the documentation
  

如果多窗口位置结构中的任何窗口设置了SWP_HIDEWINDOW或SWP_SHOWWINDOW标志,则不会重新定位任何窗口。

答案 1 :(得分:0)

除了rtfm之外,DeferWindowPos最终将调用SetWindowPos。 SetWindowPos 总是通过WM_WINDOWPOSCHANGING将它们传递给WindowProc来验证它的参数,所以,除非您还将每个窗口WindowProc作为虚拟桌面管理器的一部分挂钩,否则将它们移出屏幕会失败对于开发人员正在做一些“聪明”或不寻常的事情的窗户 - 比如夹在工作区的边缘。

答案 2 :(得分:0)

我也在文档中注意到这句话:

  

如果多窗口位置结构中的任何窗口设置了SWP_HIDEWINDOW或SWP_SHOWWINDOW标志,则不会重新定位任何窗口。

...在我已经重写了一些使用DWP的代码之后,所以我想我会尝试运行它。即使我每次调用DWP都使用了SWP_SHOWWINDOW或SWP_HIDEWINDOW,它也能正常工作。

这是在Windows 7 64位上,所以YMMV。