You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在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

火山引擎 最新活动