War*_* P 4 c++ windows delphi winapi
我昨天在我的一个Windows应用程序中发现了一个错误,该应用程序是在高级框架中构建的,最终,它会调用Windows API CreateWindow,并且ShowWindow为了显示其用户界面.
到目前为止只有一台机器,只有一台,恰好是客户机器,我观察到以下行为:
ShowWindow(Handle,SW_SHOW )此窗口时,SetWindowPos会覆盖之前收到的大小.阅读MSDN Win32 API文档,ShowWindow(Handle,SW_SHOW)我看不到它移动窗口边界的任何引用.我可以通过让我的窗口显示例程在调用Win32 ShowWindow例程之前获得边界来解决这个令人惊讶的结果.
我的问题是,有没有人见过这样的行为?我认为它必须是以下之一:
Windows 7 Service Pack 1中一个不起眼的错误,它不能在所有系统上重现,只能为特定版本的特定视频卡驱动程序重现.(此受影响的系统具有双AMD/ATI FireGL视频卡)
由系统上运行的某些其他软件的副作用引起的一个模糊的问题,可能是挂钩窗口句柄,在某处安装trampolined代码钩子(甚至可能在我自己的进程中,感谢一些DLL或我不知道的东西) .
我的400万行应用程序正在对我做的事情,通过我尚未确定的某些奇怪的代码.
我在Win32 API层中遇到了应用程序兼容性垫片.
如果任何使用过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上,这种行为是不同的.
受影响的系统具有双AMD/ATI FireGL视频卡
我不确定FireGL,但对于消费者的视频卡,在相同的芯片系列上制作,视频驱动程序确实具有重新定位窗口的附加功能,因为他们认为操作员更容易.
它被称为HydraVision Package为Catalyst Software Suite
| 归档时间: |
|
| 查看次数: |
504 次 |
| 最近记录: |