我有自定义的打印属性表/页面已添加到PrintDlgEx显示的对话框中。当然,这些属性表用于更改其他选项。问题是,似乎没有任何记录的方法来激活属性表的对话框功能中的“应用”按钮,或者任何地方。这似乎是微软的一个巨大遗漏。
是否有任何“官方”方式更改“应用”按钮的状态?如果没有,是否有可能的解决方法?
答案 0 :(得分:1)
是否有任何“官方”方式更改“应用”按钮的状态?如果没有,是否有可能的解决方法?
不直接,不。您必须手动检索按钮的HWND,然后根据需要进行操作。
使用SetWindowHookEx()
为正在调用WH_CBT
的线程安装本地PrintDlgEx()
挂钩。对话框的HWND在收到HCBT_ACTIVATE
通知时将作为回调函数的参数提供。然后,您可以在对话框中找到Apply
按钮的HWND(使用Spy ++或类似工具获取有关按钮的详细信息,然后让代码使用GetDlgItem()
或FindWindowEx()
来获取按钮的HWND) 。请务必在PrintDlgEx()
退出后致电UnhookWindowsHookEx()
(或至少在使用按钮HWND完成后)。
使用SetWinEventHook()
为正在调用EVENT_OBJECT_CREATE
的主题注册EVENT_OBJECT_SHOW
,EVENT_SYSTEM_DIALOGSTART
和/或PrintDlgEx()
个通知。对话框和按钮HWND将作为回调函数的参数提供。请务必在PrintDlgEx()
退出后致电UnhookWinEvent()
(或至少在使用按钮HWND完成后)。
一旦你有了按钮的HWND,你可以随心所欲地做任何事情。它是一个标准的按钮控件,因此可以使用任何标准按钮消息/功能。
答案 1 :(得分:1)
更接近"官方"方法是调用PropSheet_Changed()。 我获取属性表对话框的方法是查看发送到IPrintDialogCallback :: HandleMessage()的PSN_通知的来源。或者您可以使用GetParent(GetParent(generalDialog))。
调用PropSheet_Changed()后,将激活“应用”按钮。
你是对的,这对微软而言似乎是一个巨大的疏漏,因为编码不是一件简单的事情,但这是大多数人增加财产的东西床单需要。
如果有人需要,我可以提供一些代码。