有没有办法从PrintDlg打印属性页激活应用按钮?

时间:2014-01-10 20:07:21

标签: winapi printing dialog

我有自定义的打印属性表/页面已添加到PrintDlgEx显示的对话框中。当然,这些属性表用于更改其他选项。问题是,似乎没有任何记录的方法来激活属性表的对话框功能中的“应用”按钮,或者任何地方。这似乎是微软的一个巨大遗漏。

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

2 个答案:

答案 0 :(得分:1)

  

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

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

  1. 使用SetWindowHookEx()为正在调用WH_CBT的线程安装本地PrintDlgEx()挂钩。对话框的HWND在收到HCBT_ACTIVATE通知时将作为回调函数的参数提供。然后,您可以在对话框中找到Apply按钮的HWND(使用Spy ++或类似工具获取有关按钮的详细信息,然后让代码使用GetDlgItem()FindWindowEx()来获取按钮的HWND) 。请务必在PrintDlgEx()退出后致电UnhookWindowsHookEx()(或至少在使用按钮HWND完成后)。

  2. 使用SetWinEventHook()为正在调用EVENT_OBJECT_CREATE的主题注册EVENT_OBJECT_SHOWEVENT_SYSTEM_DIALOGSTART和/或PrintDlgEx()个通知。对话框和按钮HWND将作为回调函数的参数提供。请务必在PrintDlgEx()退出后致电UnhookWinEvent()(或至少在使用按钮HWND完成后)。

  3. 一旦你有了按钮的HWND,你可以随心所欲地做任何事情。它是一个标准的按钮控件,因此可以使用任何标准按钮消息/功能。

答案 1 :(得分:1)

更接近"官方"方法是调用PropSheet_Changed()。 我获取属性表对话框的方法是查看发送到IPrintDialogCallback :: HandleMessage()的PSN_通知的来源。或者您可以使用GetParent(GetParent(generalDialog))。

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

你是对的,这对微软而言似乎是一个巨大的疏漏,因为编码不是一件简单的事情,但这是大多数人增加财产的东西床单需要。

如果有人需要,我可以提供一些代码。