当用户在GetOpenFileName()中选择Cancel时,是否有类似于CDN_FILECANCEL的内容可以获取?

当用户在GetOpenFileName()中选择Cancel时,是否有类似于CDN_FILECANCEL的内容可以获取?,c,winapi,modal-dialog,comdlg32,C,Winapi,Modal Dialog,Comdlg32,出于跨平台奇偶校验的原因,myGetOpenFileName()没有指定所有者,我自己明确禁用了所有顶级窗口。问题在于重新启用,我需要在对话框关闭之前重新启用它们 在用户选择文件的情况下,这不是问题:我只是在hook过程中检查CDN\u FILEOK。没有问题,没有混乱的焦点 除了取消对话框外,我如何执行相同的操作 我在钩子过程中尝试了WM_DESTROY,但是在对话框被隐藏后运行(太晚了)。我尝试了WM_命令,但这似乎并不能涵盖所有情况。我不确定我还有什么其他选择 我现在需要瞄准Windows

出于跨平台奇偶校验的原因,my
GetOpenFileName()
没有指定所有者,我自己明确禁用了所有顶级窗口。问题在于重新启用,我需要在对话框关闭之前重新启用它们

在用户选择文件的情况下,这不是问题:我只是在hook过程中检查
CDN\u FILEOK
。没有问题,没有混乱的焦点

除了取消对话框外,我如何执行相同的操作

我在钩子过程中尝试了
WM_DESTROY
,但是在对话框被隐藏后运行(太晚了)。我尝试了
WM_命令
,但这似乎并不能涵盖所有情况。我不确定我还有什么其他选择

我现在需要瞄准Windows XP和更新版本;这也意味着没有公共项对话框。谢谢


备选方案:如果有一种方法可以执行基于回调的
GetOpenFileName()
,将控制权返回到my消息循环,就像在Mac OS X上使用
beginSheetModalForWindow:
,我可以指定一个父窗口并避免这种攻击。

取消对话框时没有CDN通知。如果用户按下Cancel按钮,您可以尝试拦截它发送给对话框的通知,甚至可以对按钮本身进行子类化。但是,如果用户通过其他方式(单击红色的X、按ESC等)取消对话框,则您可能不得不捕获
WM\u CLOSE
消息。

您犯的明显错误是帮助太多。对话框已经知道如何在没有您帮助的情况下使用模态。并且知道如何正确操作。确实如此,但我无法选择/单一/模式所有者。我想它是模态的所有窗口的程序,而不仅仅是其中一个。我的消息循环做了很多额外的事情;我不希望那些东西被
GetOpenFileName()
的重写。显然,您的代码的其余部分必须非常混乱才能打破对话框的契约。当然是从“我的消息循环”开始的。没有人能看到它。别这样,我同意
GetOpenFileName()
出于某种原因接受所有者HWND。您确实需要按照预期的方式使用它。如果必须绕开API的设计使用方式,那么消息循环显然正在做一些不应该做的事情。创建一个虚拟的隐藏所有者窗口,并将其用作对话框的所有者。当虚拟所有者被启用时,这是您的更改,以启用所有其他窗口。这两种方法都不成功。我不认为钩子程序会点击BN_;事实上,如果我正确理解了文档,它甚至不是整个打开对话框的对话框过程,而是一个子对话框。。。所以现在我想知道我最初的问题是如何工作的……您可以直接将对话框的HWND(或其父HWND)子类化以截获此类消息。