gpt4 book ai didi

c++ - 在某些特殊情况下,Win32 ShowWindow api 在 Windows 7 SP1 上的行为是否不同?

转载 作者:可可西里 更新时间:2023-11-01 14:02:53 25 4
gpt4 key购买 nike

我昨天在我的一个 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 窗口句柄,在某处安装蹦床代码 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 表示激活窗口并以其当前大小和位置显示它

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

最佳答案

This affected system has dual AMD/ATI FireGL video cards

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

它被称为 HydraVision Package for Catalyst Software Suite

关于c++ - 在某些特殊情况下,Win32 ShowWindow api 在 Windows 7 SP1 上的行为是否不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33414519/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com