如何在VBA中通过句柄修改打印对话框默认打印机名称
修改SAP打印对话框中的打印机为Microsoft Print to PDF
要实现修改打印窗口默认打印机的功能,我们需要定位到打印对话框中的打印机下拉选择控件,然后通过Windows API向它发送消息来选中目标打印机。以下是完整的实现步骤和代码:
1. 补充必要的API声明和常量
首先,我们需要添加操作下拉列表(ComboBox)所需的API常量,这些常量用于向控件发送查找和选择消息:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _ (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" _ (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _ (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Const BM_CLICK = &HF5 ' ComboBox操作常量 Const CB_FINDSTRINGEXACT = &H158 ' 精确查找列表项 Const CB_SETCURSEL = &H14E ' 设置选中指定索引的项
2. 定位打印机下拉控件并修改选择
在你已有的代码中,插入以下代码来修改打印机选择:
hWnd = FindWindow("#32770", "Print") 'LINE 1注释; ' --- 新增的修改打印机代码开始 --- Dim lblPrinter As Long Dim cboPrinter As Long Dim itemIndex As Long ' 1. 找到打印窗口中"Printer:"的静态标签控件 lblPrinter = FindWindowEx(hWnd, ByVal 0&, "Static", "Printer:") ' 2. 找到标签对应的打印机下拉选择框(ComboBox) If lblPrinter > 0 Then cboPrinter = FindWindowEx(hWnd, lblPrinter, "ComboBox", vbNullString) ' 3. 查找目标打印机"Microsoft Print to PDF"的索引 If cboPrinter > 0 Then itemIndex = SendMessage(cboPrinter, CB_FINDSTRINGEXACT, -1, ByVal "Microsoft Print to PDF") ' 4. 如果找到对应的打印机,设置为选中项 If itemIndex <> -1 Then SendMessage cboPrinter, CB_SETCURSEL, itemIndex, ByVal 0& End If End If End If ' --- 新增的修改打印机代码结束 --- Childhwnd = FindWindowEx(hWnd, ByVal 0&, "Button", "OK")'; SendMessage Childhwnd, BM_CLICK, 0, ByVal 0& 'LINE 4注释;
关键说明
- 控件定位逻辑:我们先找到"Printer:"静态标签,再通过它定位后面的下拉框,这样比直接查找ComboBox更准确(避免窗口中存在多个ComboBox控件的情况)。
- 精确匹配打印机名称:使用
CB_FINDSTRINGEXACT确保完全匹配打印机名称,避免因名称相似导致的错误选择。 - 兼容性提示:如果SAP弹出的不是标准Windows打印对话框,控件的类名或文本可能不同。你可以使用Windows自带的Spy++工具(在Visual Studio工具集中)来查看窗口控件的层级、类名和文本,调整代码中的参数。
内容的提问来源于stack exchange,提问作者Madalina




