昨天,我在一个Windows应用程序中发现了一个错误,该应用程序是在一个高级框架中构建的,该框架最终调用了Windows API(如CreateWindowShowWindow)以显示其用户界面。

到目前为止,只有一台机器,而恰好是客户机器的只有一台,我观察到以下行为:

  • 对于我整个应用程序中的仅一个窗口,当我第一次为该窗口调用ShowWindow(Handle,SW_SHOW )时,它被SetWindowPos先前接收的大小覆盖。

  • ShowWindow(Handle,SW_SHOW)上阅读MSDN Win32 API文档时,我看不到它移动窗口边界的任何引用。我可以通过让我的窗口显示例程在调用Win32 ShowWindow例程之前获得界限来解决这一令人惊讶的结果。

    我的问题是,有没有人见过这样的行为?我认为它必须是以下之一:
  • Windows 7 Service Pack 1中的一个晦涩的错误,并非在所有系统上都可以重现,而仅可以重现特定视频卡驱动程序的特定版本。 (此受影响的系统具有双AMD/ATI FireGL视频卡)
  • 由系统上运行的某些其他软件的副作用引起的一个晦涩的问题,可能是钩住窗口句柄,在某个地方安装经过弯折的代码钩子(Hook)(也许甚至在我自己的进程中,这要归功于某些DLL或我不知道的东西) )。
  • 我的400万行应用程序正在通过一些我尚未确定的奇怪代码对我做些事情。
  • 我在Win32 API层中遇到了应用程序兼容性问题。

  • 如果使用过C++,C或Delphi或任何其他语言的任何人都曾经看到过类似的东西,并且可以想到ShowWindow会产生这种令人惊讶和意外的副作用的原因,那就是将窗口的边界移回到某个原始位置,在我的情况下,x = 175,y = 175,宽度= 320,高度= 240,这似乎是最初CreateWindow调用后的窗口边界,我想知道它是什么是。

    这是一系列事件:
  • 应用程序启动,并创建一些作为桌面父级的顶级窗口。
  • 创建的第一个窗口是主应用程序窗口,第二个是工具窗口,都具有完整的窗口抓取工具栏,并且是常规的顶层Win32窗口,它们是可缩放,可拖动且以桌面为父的窗体。
  • 从磁盘加载第二个窗口的位置,并显示表格。
  • 在表单显示过程中,将其边界设置为使窗口位于x和y的顶部/左侧位置,并给出一些高度/宽度。
  • 如果我在调用ShowWindow之前立即查询Win32窗口句柄,则其边界在我期望的位置。
  • 如果在调用ShowWindow后立即查询Win32窗口句柄,则其边界已被重置。

  • 根据MSDN帮助,SW_SHOW表示Activates the window and displays it in its current size and position

    实际上,这是我观察到的100多台客户端PC上发生的情况。仅在一台客户拥有的Windows 7 PC上,此行为有所不同。

    最佳答案



    我不确定FireGL,但对于使用相同芯片系列生产的消费者视频卡,视频驱动程序确实具有附加组件来重新定位窗口,因为他们认为这对运算符(operator)来说更容易。

    它称为HydraVision PackageCatalyst Software Suite

    09-27 16:15