Winapi 是否有任何方法可以通过PrintDlgEx从打印属性页激活应用按钮?

Winapi 是否有任何方法可以通过PrintDlgEx从打印属性页激活应用按钮?,winapi,printing,dialog,Winapi,Printing,Dialog,我有自定义打印属性页/页面,它们已添加到PrintDlgEx显示的对话框中。当然,这些属性页用于更改其他选项。问题在于,似乎没有任何文档化的方法从属性页的对话框功能或任何地方激活“应用”按钮。这似乎是微软方面的一个重大疏忽 是否有任何“官方”方法来更改应用按钮的状态?如果没有,是否有任何可能的解决办法 是否有任何“官方”方法来更改应用按钮的状态?如果没有,是否有任何可能的解决办法 不是直接的,不是。您必须手动检索按钮的HWND,然后根据需要对其进行操作 用于为调用PrintDlgEx()的线程安

我有自定义打印属性页/页面,它们已添加到PrintDlgEx显示的对话框中。当然,这些属性页用于更改其他选项。问题在于,似乎没有任何文档化的方法从属性页的对话框功能或任何地方激活“应用”按钮。这似乎是微软方面的一个重大疏忽

是否有任何“官方”方法来更改应用按钮的状态?如果没有,是否有任何可能的解决办法

是否有任何“官方”方法来更改应用按钮的状态?如果没有,是否有任何可能的解决办法

不是直接的,不是。您必须手动检索按钮的HWND,然后根据需要对其进行操作

  • 用于为调用
    PrintDlgEx()
    的线程安装本地
    WH\u CBT
    钩子。当收到
    HCBT\u ACTIVATE
    通知时,对话框的HWND将作为回调函数的参数提供。然后,您可以在对话框中找到
    Apply
    按钮的HWND(使用Spy++或类似工具获取有关按钮的详细信息,然后让您的代码使用或获取按钮的HWND)。请确保在退出后调用
    PrintDlgEx()
    exits(或者至少在使用按钮HWND后)

  • 用于为调用
    PrintDlgEx()
    的线程注册
    EVENT\u OBJECT\u CREATE
    EVENT\u OBJECT\u SHOW
    、和/或
    EVENT\u SYSTEM\u DIALOGSTART
    通知。对话框和按钮HWNDs将作为回调函数的参数提供。请确保在退出后调用
    PrintDlgEx()
    exits(或者至少在使用按钮HWND后)

  • 一旦你有了按钮的HWND,你可以用它做任何你想做的事情。它是一个标准按钮控件,因此任何标准按钮消息/函数都可以与之一起使用。

    更接近“官方”的方法是调用PropSheet_Changed()。 获取属性页对话框的方法是查看发送到IPrintDialogCallback::HandleMessage()的PSN_uuu通知的源。或者可以使用GetParent(GetParent(generalDialog))

    调用PropSheet_Changed()后,应用按钮将激活

    你是对的,这对微软来说似乎是一个巨大的遗漏,因为这不是一件简单的代码编写工作,但这是大多数添加属性表的人所需要的


    如果有人需要,我可以编写一些代码。

    是的,我也在考虑类似的东西,但我的想法没有那么好。谢谢这很好!我去年完成了这个项目,但当时我没有注意到MSDN上属性表参考页中的宏。