<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      C# WinForms 實(shí)現(xiàn)打印監(jiān)聽(tīng)組件

      一、組件簡(jiǎn)介

      打印監(jiān)聽(tīng)組件是一款集成于 Windows 桌面環(huán)境的打印任務(wù)管理與監(jiān)控工具,適用于企業(yè)級(jí)應(yīng)用場(chǎng)景。它不僅支持多打印機(jī)任務(wù)的實(shí)時(shí)監(jiān)控,還能通過(guò) WebSocket 與外部系統(tǒng)集成,實(shí)現(xiàn)自動(dòng)化打印、任務(wù)狀態(tài)反饋、遠(yuǎn)程控制等功能。

      二、界面功能介紹

      1. 主界面與托盤(pán)集成

      • 主窗體:采用 WinForms 界面,包含多標(biāo)簽頁(yè)(TabControl),每個(gè)標(biāo)簽頁(yè)對(duì)應(yīng)一臺(tái)本地打印機(jī),便于分組管理。
        C# WinForms 實(shí)現(xiàn)打印監(jiān)聽(tīng)組件
      • 托盤(pán)圖標(biāo):程序最小化后駐留于系統(tǒng)托盤(pán),雙擊可快速還原主界面,支持右鍵菜單操作(如退出、重啟、服務(wù)設(shè)置等)。
        C# WinForms 實(shí)現(xiàn)打印監(jiān)聽(tīng)組件

      2. 打印機(jī)管理

      • 打印機(jī)列表:自動(dòng)檢測(cè)本地所有已安裝打印機(jī),支持設(shè)置默認(rèn)打印機(jī)、查看打印機(jī)屬性。
      /// <summary>
      /// 綁定本地打印機(jī)列表到菜單
      /// </summary>
      internal void BindPrintersToMenu()
      {
          默認(rèn)打印機(jī)ToolStripMenuItem.DropDownItems.Clear();
          // 獲取當(dāng)前系統(tǒng)默認(rèn)打印機(jī)
          string defaultPrinter = new System.Drawing.Printing.PrinterSettings().PrinterName;
      
          // 先添加默認(rèn)打印機(jī)(始終第一行)
          var defaultItem = new ToolStripMenuItem(defaultPrinter)
          {
              Checked = true
          };
          defaultItem.Click += (s, e) => SetDefaultPrinterUI(defaultPrinter);
          // 添加“首選項(xiàng)”子菜單
          var prefItem = new ToolStripMenuItem("首選項(xiàng)");
          prefItem.Click += (s, e) => ShowPrinterProperties(defaultPrinter);
          defaultItem.DropDownItems.Add(prefItem);
          默認(rèn)打印機(jī)ToolStripMenuItem.DropDownItems.Add(defaultItem);
      
          // 再添加其他打印機(jī)(排除默認(rèn)打印機(jī))
          foreach (string printer in System.Drawing.Printing.PrinterSettings.InstalledPrinters)
          {
              if (printer == defaultPrinter)
                  continue;
      
              var item = new ToolStripMenuItem(printer)
              {
                  Checked = false
              };
              item.Click += (s, e) => SetDefaultPrinterUI(printer);
      
              var prefItem2 = new ToolStripMenuItem("首選項(xiàng)");
              prefItem2.Click += (s, e) => ShowPrinterProperties(printer);
              item.DropDownItems.Add(prefItem2);
      
              默認(rèn)打印機(jī)ToolStripMenuItem.DropDownItems.Add(item);
          }
      
      }
       /// <summary>  
       /// UI和系統(tǒng)都設(shè)置默認(rèn)打印機(jī) 
       /// </summary>  
       /// <param name="printerName"></param>  
       private void SetDefaultPrinterUI(string printerName)
       {
           foreach (ToolStripMenuItem item in 默認(rèn)打印機(jī)ToolStripMenuItem.DropDownItems)
               item.Checked = item.Text == printerName;
      
           // 如需設(shè)置為系統(tǒng)默認(rèn)打印機(jī),可調(diào)用 Win32 API(可選)  
           SetSystemDefaultPrinter(printerName);
       }
       /// <summary>
      /// 顯示打印機(jī)首選項(xiàng)對(duì)話(huà)框
      /// </summary>
      /// <param name="printerName"></param>
      private void ShowPrinterProperties(string printerName)
      {
          // 使用rundll32調(diào)用打印機(jī)屬性對(duì)話(huà)框
          //string args = $"printui.dll,PrintUIEntry /p /n \"{printerName}\"";
          //?	/e 參數(shù)表示直接打開(kāi)“首選項(xiàng)”對(duì)話(huà)框
          string args = $"printui.dll,PrintUIEntry /e /n \"{printerName}\"";
          var psi = new System.Diagnostics.ProcessStartInfo
          {
              FileName = "rundll32.exe",
              Arguments = args,
              UseShellExecute = false,
              CreateNoWindow = true
          };
          try
          {
              System.Diagnostics.Process.Start(psi);
          }
          catch (Exception ex)
          {
              MessageBox.Show("無(wú)法打開(kāi)打印機(jī)首選項(xiàng)窗口:" + ex.Message, "錯(cuò)誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
          }
      }
      
      • TabControl:每臺(tái)打印機(jī)一個(gè)標(biāo)簽頁(yè),便于查看和管理各自的打印任務(wù)。
       /// <summary>
       /// 綁定本地打印機(jī)列表到TabControl
       /// </summary>
       private void BindPrintersToTabControl()
       {
           tabControl1.TabPages.Clear();
      
           string defaultPrinter = new System.Drawing.Printing.PrinterSettings().PrinterName;
           List<string> printers = new List<string>();
      
           // 先將默認(rèn)打印機(jī)添加到列表首位
           printers.Add(defaultPrinter);
      
           // 再添加其他打印機(jī)(排除默認(rèn)打印機(jī))
           foreach (string printer in System.Drawing.Printing.PrinterSettings.InstalledPrinters)
           {
               if (printer != defaultPrinter)
                   printers.Add(printer);
           }
      
           foreach (string printer in printers)
           {
               var tabPage = new TabPage(printer);
               // 創(chuàng)建DataGridView
               var dgv = new DataGridView
               {
                   Dock = DockStyle.Fill,
                   ReadOnly = true,
                   AllowUserToAddRows = false,
                   AllowUserToDeleteRows = false,
                   RowHeadersVisible = false,
                   AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
               };
      
               // 添加列
               dgv.Columns.Add("clientIp", "來(lái)源");
               dgv.Columns.Add("taskId", "任務(wù)ID");
               dgv.Columns.Add("taskName", "任務(wù)名稱(chēng)");
               dgv.Columns.Add("realName", "模板");
               dgv.Columns.Add("requestTime", "開(kāi)始時(shí)間");
               dgv.Columns.Add("status", "任務(wù)狀態(tài)");
      
               //綁定菜單
               dgv.ContextMenuStrip = dgvContextMenu;
               dgv.MouseDown += Dgv_MouseDown;
      
               // 創(chuàng)建TextBox
               var txtSearch = new TextBox
               {
                   PlaceholderText = "任務(wù)ID",
                   Width = 120,
                   Anchor = AnchorStyles.Left | AnchorStyles.Bottom
               };
      
               // 創(chuàng)建Button
               var btnSearch = new Button
               {
                   Text = "查找",
                   Width = 60,
                   Anchor = AnchorStyles.Left | AnchorStyles.Bottom
               };
      
               // 查找事件
               btnSearch.Click += (s, e) =>
               {
                   string searchId = txtSearch.Text.Trim();
                   bool found = false;
                   foreach (DataGridViewRow row in dgv.Rows)
                   {
                       if (row.IsNewRow) continue;
                       if (row.Cells["taskId"].Value?.ToString() == searchId)
                       {
                           row.Selected = true;
                           dgv.CurrentCell = row.Cells["taskId"];
                           found = true;
                       }
                       else
                       {
                           row.Selected = false;
                       }
                   }
                   if (!found)
                   {
                       MessageBox.Show("未找到對(duì)應(yīng)任務(wù)ID!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                   }
               };
      
               // 使用Panel布局
               var panel = new Panel
               {
                   Dock = DockStyle.Bottom,
                   Height = 40
               };
               txtSearch.Location = new Point(10, 8);
               btnSearch.Location = new Point(140, 6);
               panel.Controls.Add(txtSearch);
               panel.Controls.Add(btnSearch);
      
               tabPage.Controls.Add(panel);
               tabPage.Controls.Add(dgv);
               tabControl1.TabPages.Add(tabPage);
           }
       }
      

      3. 打印任務(wù)監(jiān)控

      • 任務(wù)列表:每個(gè)打印機(jī)標(biāo)簽頁(yè)下方為 DataGridView,實(shí)時(shí)顯示當(dāng)前打印任務(wù),包括來(lái)源、任務(wù)ID、任務(wù)名稱(chēng)、模板、開(kāi)始時(shí)間、任務(wù)狀態(tài)等信息。
        C# WinForms 實(shí)現(xiàn)打印監(jiān)聽(tīng)組件
      • 右鍵菜單:支持對(duì)單個(gè)任務(wù)進(jìn)行“取消打印”、“重新打印”、“刪除記錄”等操作。
        C# WinForms 實(shí)現(xiàn)打印監(jiān)聽(tīng)組件
      • 任務(wù)搜索:支持按任務(wù)ID快速定位任務(wù)。

      4. 其他功能

      • 服務(wù)控制:可一鍵啟動(dòng)/停止 WebSocket 服務(wù),支持與外部系統(tǒng)通信。
      • 模板設(shè)計(jì)與預(yù)覽:集成 FastReport 設(shè)計(jì)器和預(yù)覽器,方便模板維護(hù)。

      因?yàn)镕astReport.Net 是需要購(gòu)買(mǎi)授權(quán)的,所以我使用的是FastReport.OpenSource(開(kāi)源版),開(kāi)源版功能太少,不能直接從程序內(nèi)部調(diào)用FastReport設(shè)計(jì)器和預(yù)覽器,只能通過(guò)啟動(dòng)本地安裝的.exe來(lái)實(shí)現(xiàn)。

      /// <summary>
      /// 設(shè)計(jì)菜單項(xiàng)點(diǎn)擊事件,啟動(dòng) FastReport 設(shè)計(jì)器
      /// </summary>
      /// <param name="sender"></param>
      /// <param name="e"></param>
      private void 設(shè)計(jì)ToolStripMenuItem_Click(object sender, EventArgs e)
      {
          string designerPath = GetConfigValue("designer_path");
          string templatePath = GetTemplatePathFromConfig();
          if (string.IsNullOrEmpty(designerPath) || !System.IO.File.Exists(designerPath))
          {
              MessageBox.Show("未找到 FastReport 設(shè)計(jì)器,請(qǐng)檢查 config.ini 配置!", "錯(cuò)誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
              return;
          }
          if (!System.IO.File.Exists(templatePath))
          {
              MessageBox.Show("未找到模板文件,請(qǐng)檢查路徑!", "錯(cuò)誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
              return;
          }
          try
          {
              System.Diagnostics.Process.Start(designerPath, $"\"{templatePath}\"");
          }
          catch (Exception ex)
          {
              MessageBox.Show("啟動(dòng) FastReport 設(shè)計(jì)器失敗:" + ex.Message, "錯(cuò)誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
          }
      }
      private void 預(yù)覽ToolStripMenuItem_Click(object sender, EventArgs e)
      {
          string viewerPath = GetConfigValue("viewer_path");
          string templatePath = GetTemplatePathFromConfig();
          if (string.IsNullOrEmpty(viewerPath) || !System.IO.File.Exists(viewerPath))
          {
              MessageBox.Show("未找到 FastReport 預(yù)覽器,請(qǐng)檢查 config.ini 配置!", "錯(cuò)誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
              return;
          }
          if (!System.IO.File.Exists(templatePath))
          {
              MessageBox.Show("未找到模板文件,請(qǐng)檢查路徑!", "錯(cuò)誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
              return;
          }
          try
          {
              System.Diagnostics.Process.Start(viewerPath, $"\"{templatePath}\"");
          }
          catch (Exception ex)
          {
              MessageBox.Show("啟動(dòng) FastReport 預(yù)覽器失敗:" + ex.Message, "錯(cuò)誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
          }
      }
      
      • 自動(dòng)更新:支持在線檢查和自動(dòng)更新程序版本。

      這里使用的是:Autoupdater.NET

      • 幫助與支持:內(nèi)置開(kāi)發(fā)者聯(lián)系方式,便于用戶(hù)反饋和技術(shù)支持。
        開(kāi)發(fā)者聯(lián)系方式:wxscc@foxmail.com

      三、技術(shù)要點(diǎn)

      1. 打印任務(wù)監(jiān)聽(tīng)與管理

      • WMI 打印作業(yè)監(jiān)控
        通過(guò) System.Management 命名空間,使用 WMI 查詢(xún) Win32_PrintJob,實(shí)現(xiàn)對(duì)打印隊(duì)列的實(shí)時(shí)監(jiān)控。可根據(jù)任務(wù)ID或文檔名唯一標(biāo)識(shí),精確定位和管理打印作業(yè)。
      using System.Management;
      
       /// <summary>
       /// 打印機(jī)監(jiān)聽(tīng)方法實(shí)現(xiàn)
       /// </summary>
       /// <param name="printerName"></param>
       /// <param name="taskId"></param>
       private void StartMonitorPrintJob(string printerName, int taskId, string taskName)
       {
           Task.Run(() =>
           {
               try
               {
                   string query = $"SELECT * FROM Win32_PrintJob WHERE Name LIKE '%{printerName}%'";
                   using (var searcher = new ManagementObjectSearcher(query))
                   {
                       while (true)
                       {
                           var jobs = searcher.Get();
                           bool found = false;
                           foreach (ManagementObject job in jobs)
                           {
                               found = true;
                               int JobId = Convert.ToInt32(job["JobId"]);
                               if (JobId == taskId)
                               {
                                   // 匹配到本任務(wù),更新?tīng)顟B(tài)
                                   string jobStatus = job["JobStatus"]?.ToString() ?? "";
                                   string status = job["Status"]?.ToString() ?? "";
                                   string displayStatus = string.IsNullOrEmpty(jobStatus) ? status : jobStatus;
                                   UpdateTaskStatusOnUI(printerName, taskName, displayStatus);
                                   if (displayStatus.Contains("Printed") || displayStatus.Contains("Completed") || displayStatus.Contains("Deleted"))
                                       return;
                               }
                           }
                           if (!found)
                           {
                               // 作業(yè)已消失,認(rèn)為已完成
                               UpdateTaskStatusOnUI(printerName, taskName, "已完成");
                               return;
                           }
                           Thread.Sleep(1000); // 1秒輪詢(xún)
                       }
                   }
               }
               catch (Exception ex)
               {
                   UpdateTaskStatusOnUI(printerName, taskName, "狀態(tài)監(jiān)聽(tīng)失敗");
               }
           });
       }
      
      • 任務(wù)狀態(tài)同步
        通過(guò)輪詢(xún)方式定時(shí)查詢(xún)打印隊(duì)列,自動(dòng)更新任務(wù)狀態(tài)(如“正在打印”、“已完成”、“已取消”等),并在 UI 上實(shí)時(shí)反饋。

      2. 打印任務(wù)操作

      • 取消打印
        通過(guò) WMI 刪除指定打印作業(yè),確保任務(wù)被及時(shí)從隊(duì)列中移除,并同步更新界面狀態(tài)。
       /// <summary>
       /// 取消打印
       /// </summary>
       /// <param name="sender"></param>
       /// <param name="e"></param>
       private void CancelPrint_Click(object sender, EventArgs e)
       {
           var dgv = GetCurrentDgv();
           if (dgv == null) return;
           var row = dgv.SelectedRows.Count > 0 ? dgv.SelectedRows[0] : null;
           if (row == null) return;
           int taskId = Convert.ToInt32(row.Cells["taskId"].Value);
           string printerName = tabControl1.SelectedTab.Text;
           // 查詢(xún)打印隊(duì)列,找到文檔名包含 taskId 的作業(yè)
           string query = $"SELECT * FROM Win32_PrintJob WHERE Name LIKE '%{printerName}%'";
           using (var searcher = new System.Management.ManagementObjectSearcher(query))
           {
               foreach (System.Management.ManagementObject job in searcher.Get())
               {
                   int JobId = Convert.ToInt32(job["JobId"]);
                   if (JobId == taskId)
                   {
                       try
                       {
                           job.Delete(); // 刪除打印任務(wù)
                           row.Cells["status"].Value = "已取消";
                           MessageBox.Show($"已取消打印任務(wù):{taskId}", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                       }
                       catch (Exception ex)
                       {
                           MessageBox.Show("取消打印失敗:" + ex.Message, "錯(cuò)誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
                       }
                       return;
                   }
               }
           }
           MessageBox.Show("未找到對(duì)應(yīng)的打印任務(wù),可能已完成或被清除。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
       }
      
      • 重新打印
        首次打印時(shí)將所有參數(shù)(文件路徑、數(shù)據(jù)、模板名等)保存在 DataGridView 行的 Tag 屬性,重新打印時(shí)直接復(fù)用原始參數(shù),保證打印一致性。
       /// <summary>
       /// 重新打印
       /// </summary>
       /// <param name="sender"></param>
       /// <param name="e"></param>
       private void Reprint_Click(object sender, EventArgs e)
       {
           var dgv = GetCurrentDgv();
           if (dgv == null) return;
           var row = dgv.SelectedRows.Count > 0 ? dgv.SelectedRows[0] : null;
           if (row == null) return;
           if (row.Tag is PrintTaskInfo info)
           {
               // 復(fù)用原 taskName,或可選生成新 taskName
               string taskName = row.Cells["taskName"].Value.ToString();
               string status = row.Cells["status"].Value.ToString();
               if (status == "已完成")
                   PrintFile(info.FilePath, info.Data, taskName);
           }
           else
           {
               MessageBox.Show("未找到原始打印信息,無(wú)法重新打印。", "錯(cuò)誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
           }
       }
      
      • 刪除記錄
        支持在任務(wù)未完成時(shí)先刪除打印隊(duì)列中的作業(yè),再移除界面記錄,防止“假刪除”導(dǎo)致隊(duì)列堆積。
      /// <summary>
      /// 刪除打印記錄
      /// </summary>
      /// <param name="sender"></param>
      /// <param name="e"></param>
      private void DeleteRecord_Click(object sender, EventArgs e)
      {
          var dgv = GetCurrentDgv();
          if (dgv == null) return;
          var row = dgv.SelectedRows.Count > 0 ? dgv.SelectedRows[0] : null;
          if (row == null) return;
      
          int taskId = Convert.ToInt32(row.Cells["taskId"].Value);
          string status = row.Cells["status"].Value?.ToString();
          string printerName = tabControl1.SelectedTab.Text;
          // 如果未完成,先刪除打印隊(duì)列中的任務(wù)
          if (status != "已完成" && status != "已取消")
          {
              string query = $"SELECT * FROM Win32_PrintJob WHERE Name LIKE '%{printerName}%'";
              using (var searcher = new System.Management.ManagementObjectSearcher(query))
              {
                  foreach (System.Management.ManagementObject job in searcher.Get())
                  {
                      int JobId = Convert.ToInt32(job["JobId"]);
                      if (JobId == taskId)
                      {
                          try
                          {
                              job.Delete(); // 刪除打印任務(wù)
                          }
                          catch (Exception ex)
                          {
                              MessageBox.Show("刪除打印任務(wù)失敗:" + ex.Message, "錯(cuò)誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
                          }
                          break;
                      }
                  }
              }
          }
          dgv.Rows.Remove(row);
      }
      

      3. WebSocket 通信

      • Fleck 組件集成
        使用 Fleck 實(shí)現(xiàn) WebSocket 服務(wù)端,支持外部系統(tǒng)通過(guò)網(wǎng)絡(luò)下發(fā)打印任務(wù)、查詢(xún)狀態(tài)、遠(yuǎn)程控制等。
      • 消息協(xié)議設(shè)計(jì)
        采用 JSON 協(xié)議,支持多種命令(如 printshowping 等),并能將打印結(jié)果、錯(cuò)誤信息實(shí)時(shí)反饋給客戶(hù)端。
      socket.OnMessage = message =>
      {
          var msg = message?.Trim().ToLowerInvariant();
          // 處理不同的消息
          if (msg == "ping")
          {
              // 回復(fù) pong
              socket.Send("pong");
          }
          else if (msg == "show")
          {
              // 顯示主窗體
              this.Invoke(() =>
              {
                  this.Show();
                  this.WindowState = FormWindowState.Normal;
                  this.ShowInTaskbar = true;
                  this.Activate();
              });
          }
          else if (msg != null && msg.TrimStart().StartsWith("{"))
          {
              // 反序列化為 JsonNode 便于動(dòng)態(tài)訪問(wèn)
              var json = JsonNode.Parse(msg);
              var cmd = json?["cmd"]?.ToString();
              string requestId = json?["requestid"]?.ToString();
              //處理打印任務(wù)
              if (cmd == "print")
              {
                  // 取出 printIniInfo 和 data
                  var printIniInfo = json["data"]?["printiniinfo"];
                  var data = json["data"]?["data"];
                  string filePath = printIniInfo?["filepath"]?.ToString();
                  string realName = printIniInfo?["realname"]?.ToString();
      
                  // 獲取來(lái)源IP和端口
                  string clientIp = socket.ConnectionInfo.ClientIpAddress;
                  int clientPort = socket.ConnectionInfo.ClientPort;
                  string requestTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                  string status = "作業(yè)正在后臺(tái)處理";
                  // 獲取當(dāng)前系統(tǒng)默認(rèn)打印機(jī)
                  string printerName = new System.Drawing.Printing.PrinterSettings().PrinterName;
                  int taskId = 0;
                  // 任務(wù)名稱(chēng)為當(dāng)前時(shí)間
                  string taskName = DateTime.Now.ToString("yyyyMMddHHmmssfff");
                  // 查找對(duì)應(yīng)TabPage和DataGridView
                  this.Invoke(() =>
                  {
                      foreach (TabPage tab in tabControl1.TabPages)
                      {
                          // 支持“(默認(rèn))”后綴
                          if (tab.Text.StartsWith(printerName))
                          {
                              var dgv = tab.Controls.OfType<DataGridView>().FirstOrDefault();
                              if (dgv != null)
                              {
                                  int rowIndex = dgv.Rows.Add(
                                       $"{clientIp}:{clientPort}", // 來(lái)源
                                       taskId,                     // 任務(wù)ID
                                       taskName,                   // 任務(wù)名稱(chēng)
                                       realName,                   // 模板
                                       requestTime,                // 開(kāi)始時(shí)間
                                       status                      // 任務(wù)狀態(tài)
                                   );
                                  var row = dgv.Rows[rowIndex];
                                  row.Tag = new PrintTaskInfo
                                  {
                                      FilePath = filePath,
                                      Data = data
                                  };
                                  // 添加后排序
                                  dgv.Sort(dgv.Columns["requestTime"], ListSortDirection.Descending);
                              }
                              break;
                          }
                      }
                  });
                  // 調(diào)用實(shí)際打印方法
                  this.Invoke(() => PrintFile(filePath, data, taskName, socket, requestId));
      
                  //監(jiān)聽(tīng)打印機(jī)狀態(tài)
                  StartMonitorPrintJob(printerName, taskId, taskName);
              }
              else
              {
                  // 處理其他cmd
                  Console.WriteLine($"收到未知cmd: {cmd}");
              }
          }
          else
          {
              Console.WriteLine($"收到未知消息: {message}");
          }
      };
      
      • 異常處理與反饋
        打印過(guò)程中如遇異常(如文件不存在、數(shù)據(jù)格式錯(cuò)誤等),會(huì)捕獲異常并通過(guò) WebSocket 回復(fù)詳細(xì)錯(cuò)誤信息,便于外部系統(tǒng)及時(shí)處理。

      4. 打印文件類(lèi)型支持

      • 多格式兼容
        支持 TXT、圖片(JPG/PNG/BMP/GIF)、PDF、FastReport 模板(FRX)等多種文件類(lèi)型的打印。
        C# WinForms 實(shí)現(xiàn)打印監(jiān)聽(tīng)組件
        C# WinForms 實(shí)現(xiàn)打印監(jiān)聽(tīng)組件
      • 模板數(shù)據(jù)綁定
        對(duì)于報(bào)表類(lèi)打印,支持將 JSON、DataTable、DataSet 等多種數(shù)據(jù)源動(dòng)態(tài)綁定到模板,實(shí)現(xiàn)靈活的數(shù)據(jù)驅(qū)動(dòng)打印。

      5. 用戶(hù)體驗(yàn)優(yōu)化

      • 界面交互友好
        采用右鍵菜單、彈窗提示、托盤(pán)集成等方式,提升用戶(hù)操作便捷性。
      • 錯(cuò)誤提示與日志
        所有關(guān)鍵操作均有明確的錯(cuò)誤提示,便于用戶(hù)定位問(wèn)題;可擴(kuò)展日志記錄功能,方便后期維護(hù)。

      四、總結(jié)

      打印監(jiān)聽(tīng)組件通過(guò)對(duì)打印隊(duì)列的實(shí)時(shí)監(jiān)控、任務(wù)的精細(xì)化管理、與外部系統(tǒng)的高效集成,極大提升了企業(yè)打印自動(dòng)化和可控性。其靈活的界面、豐富的功能和健壯的技術(shù)架構(gòu),適用于多種業(yè)務(wù)場(chǎng)景,值得在企業(yè)信息化建設(shè)中推廣應(yīng)用。


      版權(quán)聲明:本文為作者原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接和本聲明。
      作者: 碼農(nóng)剛子
      原文鏈接: https://www.codeobservatory.cn/archives/bdd5c491.html

      posted @ 2025-06-14 17:38  碼農(nóng)剛子  閱讀(1674)  評(píng)論(13)    收藏  舉報(bào)
      主站蜘蛛池模板: 亚洲AV午夜成人无码电影| 伊人天天久大香线蕉av色| 中文字幕国产日韩精品| 大香伊蕉在人线国产av| 久久亚洲国产五月综合网| 国产福利酱国产一区二区| 五月丁香色综合久久4438| 亚洲精品综合网二三区| 日韩有码中文字幕国产| 亚洲一区二区三区| 靖西县| 国产午夜精品亚洲精品国产| 国产一区二区在线有码| 国产精品成人中文字幕| 热久在线免费观看视频 | 中文字幕av国产精品| 性视频一区| 四虎精品国产永久在线观看| 99精品久久免费精品久久| 成人国产精品中文字幕| 亚洲中少妇久久中文字幕| 成人午夜av在线播放| www久久只有这里有精品| 亚洲AV无码一二区三区在线播放| 少妇太爽了在线观看免费视频| 欧美日韩国产亚洲沙发| 久久国产自拍一区二区三区| 狠狠色噜噜狠狠亚洲AV| 综合久久婷婷综合久久| 国产影片AV级毛片特别刺激| 欲香欲色天天天综合和网| 亚洲精品国模一区二区| 久久99精品九九九久久婷婷| 亚洲国产高清第一第二区| 久久亚洲精品日本波多野结衣| 野花香视频在线观看免费高清版| 门国产乱子视频观看| 日韩中文字幕亚洲精品 | 国产一级r片内射免费视频| 97久久精品无码一区二区天美| 日本一区二区三区在线看|