Winapi 如何从对话框中查找禁用的父窗口

Winapi 如何从对话框中查找禁用的父窗口,winapi,modal-dialog,Winapi,Modal Dialog,我在IE中有一个页面呈现,它创建了一个样式为WS_POPUP-showModalDialog的模型对话框。我可以找到对话框的HWND,但如何才能找到父级的HWND? 由于“模型”对话框及其父级在不同的进程上运行,因此API函数getParent不起作用。此外有时另一个窗口可能位于对话框和父页面之间,这会阻止我使用“下一个窗口”: 没有代码,API函数getParent不起作用也没有帮助。您应该在属性->窗口中使用Spy++父值进行检查 请同时查看中的备注部分 要获取窗口的所有者窗口,请使用带有G

我在IE中有一个页面呈现,它创建了一个样式为WS_POPUP-showModalDialog的模型对话框。我可以找到对话框的HWND,但如何才能找到父级的HWND? 由于“模型”对话框及其父级在不同的进程上运行,因此API函数getParent不起作用。此外有时另一个窗口可能位于对话框和父页面之间,这会阻止我使用“下一个窗口”:

没有代码,API函数getParent不起作用也没有帮助。您应该在属性->窗口中使用Spy++父值进行检查

请同时查看中的备注部分

要获取窗口的所有者窗口,请使用带有GW_所有者标志的GetWindow,而不是使用GetParent。要获取父窗口而不是所有者,请使用带有GA_parent标志的get祖先,而不是使用GetParent

你写了:

另外!!有时,另一个窗口可能位于对话框和父页面之间

这可能表明你没有真正的所有者关系。也许只有禁用所有者窗口并使对话框位于最顶端才能模拟它。您可以使用Spy++在Properties->Styles中查找WS_EX_TOPMOST来验证这一点。使用HideThatWindow应用程序,您可以在运行时操纵窗口样式,并进一步确认这一点

为了获得HWND,我会将自定义消息从一个窗口发布到另一个窗口

UINT MyWmMessage = RegisterWindowMessage( TEXT( "HereIsMyHWND.mydomainname.pl" ) );
...
PostMessage( DialogHWND, MyWmMessage, 0, (LPARAM) ParentHWND );
和在对话框窗口中:

// If this is in another process, reregister custom message.
UINT MyWmMessage = RegisterWindowMessage( TEXT( "HereIsMyHWND.mydomainname.pl" ) );
...
LRESULT CALLBACK DialogWindowProc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam )
{
    ...
    if ( msg == MyWmMessage )
    {
        WeGotParentHWND = (HWND) lparam;
    }
    ...
}
简短回答:这是一种“如果你还不知道后果是什么,那么你就没有足够的智慧去正确地做”的事情。