我已经将自定义打印属性页/页面添加到PrintDlgEx显示的对话框中。这些属性表当然用于更改其他选项。问题在于,似乎没有任何文档化的方式来激活属性表对话框中的应用按钮,或者任何地方。这似乎是微软方面的一大漏洞。有没有办法使用PrintDlgEx从打印页面激活“应用”按钮?
是否有任何“官方”方式来更改“应用”按钮的状态?如果没有,是否有任何可能的解决方法?
我已经将自定义打印属性页/页面添加到PrintDlgEx显示的对话框中。这些属性表当然用于更改其他选项。问题在于,似乎没有任何文档化的方式来激活属性表对话框中的应用按钮,或者任何地方。这似乎是微软方面的一大漏洞。有没有办法使用PrintDlgEx从打印页面激活“应用”按钮?
是否有任何“官方”方式来更改“应用”按钮的状态?如果没有,是否有任何可能的解决方法?
是否有任何“官方”方式来改变Apply按钮的状态?如果没有,是否有任何可能的解决方法?
不直接,没有。您将不得不手动检索按钮的HWND,然后根据需要对其进行处理。
使用SetWindowHookEx()
安装本地WH_CBT
钩正在调用PrintDlgEx()
线程。当收到通知时,对话框的HWND将作为回调函数的参数。然后,您可以在对话框中找到Apply
按钮的HWND(使用Spy ++或类似工具获取有关按钮的详细信息,然后让您的代码使用GetDlgItem()
或FindWindowEx()
获取按钮的HWND)。在PrintDlgEx()
退出后(或者至少在完成使用按钮HWND后),请务必拨打UnhookWindowsHookEx()
。
使用SetWinEventHook()
以注册EVENT_OBJECT_CREATE
,EVENT_OBJECT_SHOW
,和/或通知EVENT_SYSTEM_DIALOGSTART
(个),正在调用PrintDlgEx()
线程。对话框和按钮HWNDs将作为回调函数的参数。 PrintDlgEx()
退出后(或者至少在您完成使用按钮HWND后),请务必致电UnhookWinEvent()
。
一旦你有了按钮的HWND,你就可以随心所欲地做任何事情。这是一个标准的按钮控制,所以任何标准的按钮消息/功能都可以使用它。
更接近“官方”的方式是调用PropSheet_Changed()。 我得到属性表对话框的方式是查看发送到IPrintDialogCallback :: HandleMessage()的PSN_通知的来源。或者你可以使用GetParent(GetParent(generalDialog))。
一旦你调用PropSheet_Changed(),应用按钮将被激活。
你说得对,这似乎是微软方面的一个巨大漏洞,因为编码并不是一件简单的事情,但这是大多数人添加属性表所需要的东西。
我可以把一些代码,如果任何人需要它。
这非常好!去年我完成了这个项目,但当时我没有注意到MSDN上的属性表参考页中的宏。 – DOS
是的,我也在想类似的东西,但我的想法并不好。谢谢! – DOS