在某些特殊情况下,Win32 ShowWindow api 在 Windows 7 SP1 上的行为是不是不同?
Posted
技术标签:
【中文标题】在某些特殊情况下,Win32 ShowWindow api 在 Windows 7 SP1 上的行为是不是不同?【英文标题】:Does the Win32 ShowWindow api behave differently on Windows 7 SP1 in some special case?在某些特殊情况下,Win32 ShowWindow api 在 Windows 7 SP1 上的行为是否不同? 【发布时间】:2015-10-29 12:40:10 【问题描述】:我昨天在我的一个 Windows 应用程序中发现了一个错误,该应用程序构建在一个高级框架中,最终调用 Windows API,如CreateWindow
和ShowWindow
,以显示其用户界面。
到目前为止,只有一台机器,恰好是一台客户机器,我观察到以下行为:
对于整个应用程序中的一个窗口,当我第一次为这个窗口调用ShowWindow(Handle,SW_SHOW )
时,它之前由SetWindowPos
接收的大小被覆盖。
阅读 ShowWindow(Handle,SW_SHOW)
上的 MSDN Win32 API 文档,我看不到它移动窗口边界的任何参考。我可以通过让我的窗口显示例程在调用 Win32 ShowWindow
例程之前获得边界来解决这个令人惊讶的结果。
我的问题是,有没有人见过这样的行为?我认为它必须是以下之一:
Windows 7 Service Pack 1 中的一个不明显的错误,它不会在所有系统上重现,并且可能仅针对特定视频卡驱动程序的特定版本重现。 (这个受影响的系统有双 AMD/ATI FireGL 显卡)
由系统上运行的某些其他软件的副作用引起的一个模糊问题,可能是挂钩窗口句柄、在某处安装蹦床代码挂钩(甚至可能在我自己的进程中,这要归功于一些 DLL 或其他东西我不知道)。
我的 400 万行应用程序正在通过一些我尚未确定的奇怪代码对我做些什么。
我遇到了 Win32 API 层中的应用程序兼容性 shim。
如果任何使用过 C++、C 或 Delphi 或任何其他语言的人曾经见过这样的事情,并能想到为什么 ShowWindow
会产生这种令人惊奇和意想不到的副作用,即移动界限的原因窗口,回到某个原始位置,在我的例子中,x=175,y=175,width=320,height=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 上,此行为有所不同。
【问题讨论】:
你能在失败的机器上调试吗?还是远程调试器?您可能能够以编程方式在大小参数上设置数据断点并捕获更改的位置。我相信 Visual Studio 可以做到这一点。 另一种可能是这台机器上有一些安装了消息挂钩的软件,甚至可能是恶意软件。 我也想到了恶意软件的可能性。我无法运行远程调试器,因为它是只能通过 LogMe Rescue 控制台访问的客户端 PC,我什至没有 *** 连接。我花了几十个小时试图配置一台 Windows 7 机器,所以我无法重现这一点。到目前为止,我学到的是通过检测并将日志记录添加到我的可执行文件中。我无法在此系统上安装任何重量级 IDE,但我可以在 WinDbg 中进行调试 我认为您需要将其隔离为复制品。 如果你改变那个窗口的类名会发生什么?如果安装了一个宽消息挂钩,它可能正在寻找该类名。只是一个想法...... 【参考方案1】:这个受影响的系统有双 AMD/ATI FireGL 显卡
我不确定 FireGL,但对于基于相同芯片谱系制造的消费者视频卡,视频驱动程序完全有附加组件来重新定位窗口,因为他们认为对操作员来说更容易。
它被称为HydraVision Package
for Catalyst Software Suite
【讨论】:
以上是关于在某些特殊情况下,Win32 ShowWindow api 在 Windows 7 SP1 上的行为是不是不同?的主要内容,如果未能解决你的问题,请参考以下文章
win32设置当前窗口——SetForegroundWindow,SetActiveWindow, or ShowWindow?