我最近使用Microsoft的Spy++检查了一个GUI,并注意到了一个奇怪的结构; 它看起来像这样(警告,前面是ASCII艺术):
|
+ 002004D6 "MyRootWindow1" FooClassName
| |
| + 001F052C "MyChildWindow" ClassOfChildWindow
|
\ 001D0A8C "MyRootWindow2" SomeOtherClassName
有两个根窗口,002004D6和001D0A8c,前者有一个子窗口001F052C。
现在,如果不是一件事情,这就很好:调用GetParent(或在Spy ++中观察“父窗口”或“所有者窗口”字段)子窗口(001F052C)会产生001D0A8C。
阅读:“MyChildWindow”是“MyRootWindow1”的子窗口,但“MyRootWindow1”不是“MyChildWindow”的父窗口。相反,“MyChildWindow”的父窗口是“MyRootWindow2”,但是,为了使这个完整,枚举“MyRootWindow2”的子窗口并不会得到“MyChildWindow”。
这是一个完全静态的GUI应用程序,因此这里没有任何竞争条件或其他问题。
有人知道这是如何发生的吗?有人知道我如何解决这个问题吗?直到现在,我使用GetParent和EnumChildWindows来获取给定HWND的父(或子)窗口,并假设这种关系是对称的。也许还有其他我应该使用的东西吗?
编辑:这里是一个小的C++程序的代码,演示了这个问题:
请注意'child'对象具有
现在,如果不是一件事情,这就很好:调用GetParent(或在Spy ++中观察“父窗口”或“所有者窗口”字段)子窗口(001F052C)会产生001D0A8C。
阅读:“MyChildWindow”是“MyRootWindow1”的子窗口,但“MyRootWindow1”不是“MyChildWindow”的父窗口。相反,“MyChildWindow”的父窗口是“MyRootWindow2”,但是,为了使这个完整,枚举“MyRootWindow2”的子窗口并不会得到“MyChildWindow”。
这是一个完全静态的GUI应用程序,因此这里没有任何竞争条件或其他问题。
有人知道这是如何发生的吗?有人知道我如何解决这个问题吗?直到现在,我使用GetParent和EnumChildWindows来获取给定HWND的父(或子)窗口,并假设这种关系是对称的。也许还有其他我应该使用的东西吗?
编辑:这里是一个小的C++程序的代码,演示了这个问题:
const HINSTANCE thisModule = ::GetModuleHandle( NULL );
HWND oldParent = ::CreateWindow( TEXT("STATIC"),
TEXT("Old parent"),
WS_VISIBLE | WS_BORDER,
0, 0, 850, 500,
NULL,
NULL,
thisModule,
NULL );
HWND child = ::CreateWindow( TEXT("STATIC"),
TEXT("This is a sample dialog"),
WS_OVERLAPPED | WS_POPUP | WS_VISIBLE | WS_BORDER,
100, 100, 300, 300,
oldParent,
NULL,
thisModule,
NULL );
HWND newParent = ::CreateWindow( TEXT("STATIC"),
TEXT("Fake main window"),
WS_VISIBLE | WS_BORDER,
0, 0, 850, 500,
NULL,
NULL,
thisModule,
NULL );
::SetParent( child, newParent );
请注意'child'对象具有
WS_POPUP
和WS_OVERLAPPED
设置,但没有WS_CHILD
。
WS_CHILD
。此外,父窗口可能与所有者窗口不同(尽管这很少见)。看起来你可能正在为子窗口设置两者。你能详细说明一下你想要实现什么吗? - Adrian McCarthy