فهرست منبع

fix: OpenPrinter加PRINTER_DEFAULTS结构体——避免打印到文件弹窗

lq 1 ماه پیش
والد
کامیت
d7de3605ac
1فایلهای تغییر یافته به همراه15 افزوده شده و 3 حذف شده
  1. 15 3
      internal/modules/printer/service/serial.go

+ 15 - 3
internal/modules/printer/service/serial.go

@@ -51,6 +51,12 @@ var (
 	procEndDoc       = winspool.NewProc("EndDocPrinter")
 )
 
+type PRINTER_DEFAULTS struct {
+	pDatatype     *uint16
+	pDevMode      uintptr
+	DesiredAccess uint32
+}
+
 type DOC_INFO_1 struct {
 	pDocName    *uint16
 	pOutputFile *uint16
@@ -59,18 +65,24 @@ type DOC_INFO_1 struct {
 
 func PrintRaw(printerName string, data []byte) error {
 	namePtr, _ := syscall.UTF16PtrFromString(printerName)
+	rawType, _ := syscall.UTF16PtrFromString("RAW")
+
+	pd := PRINTER_DEFAULTS{
+		pDatatype:     rawType,
+		pDevMode:      0,
+		DesiredAccess: 0x000F0000 | 0x00000008, // PRINTER_ACCESS_USE | PRINTER_ACCESS_ADMINISTER
+	}
 
 	var handle syscall.Handle
 	ret, _, _ := procOpenPrinter.Call(uintptr(unsafe.Pointer(namePtr)),
-		uintptr(unsafe.Pointer(&handle)), 0)
+		uintptr(unsafe.Pointer(&handle)), uintptr(unsafe.Pointer(&pd)))
 	if ret == 0 {
 		return fmt.Errorf("OpenPrinter 失败: %s", printerName)
 	}
 	defer procClosePrinter.Call(uintptr(handle))
 
 	docName, _ := syscall.UTF16PtrFromString("Parking Ticket")
-	dataType, _ := syscall.UTF16PtrFromString("RAW")
-	di := DOC_INFO_1{pDocName: docName, pDataType: dataType}
+	di := DOC_INFO_1{pDocName: docName, pDataType: rawType}
 
 	procStartDoc.Call(uintptr(handle), 1, uintptr(unsafe.Pointer(&di)))
 	procStartPage.Call(uintptr(handle))