最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#?WinForms實(shí)現(xiàn)打印監(jiān)聽組件工具

 更新時(shí)間:2026年04月13日 09:18:23   作者:碼農(nóng)剛子  
打印監(jiān)聽組件是一款集成于?Windows?桌面環(huán)境的打印任務(wù)管理與監(jiān)控工具,適用于企業(yè)級(jí)應(yīng)用場景,下面我們就來看看C#?WinForms實(shí)現(xiàn)打印監(jiān)聽組件工具的具體方法吧,希望對(duì)大家有所幫助

一、組件簡介

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

二、界面功能介紹

1. 主界面與托盤集成

主窗體:采用 WinForms 界面,包含多標(biāo)簽頁(TabControl),每個(gè)標(biāo)簽頁對(duì)應(yīng)一臺(tái)本地打印機(jī),便于分組管理。

托盤圖標(biāo):程序最小化后駐留于系統(tǒng)托盤,雙擊可快速還原主界面,支持右鍵菜單操作(如退出、重啟、服務(wù)設(shè)置等)。

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ì)話框
/// </summary>
/// <param name="printerName"></param>
private void ShowPrinterProperties(string printerName)
{
    // 使用rundll32調(diào)用打印機(jī)屬性對(duì)話框
    //string args = $"printui.dll,PrintUIEntry /p /n \"{printerName}\"";
    //?	/e 參數(shù)表示直接打開“首選項(xiàng)”對(duì)話框
    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("無法打開打印機(jī)首選項(xiàng)窗口:" + ex.Message, "錯(cuò)誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

TabControl:每臺(tái)打印機(jī)一個(gè)標(biāo)簽頁,便于查看和管理各自的打印任務(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", "來源");
         dgv.Columns.Add("taskId", "任務(wù)ID");
         dgv.Columns.Add("taskName", "任務(wù)名稱");
         dgv.Columns.Add("realName", "模板");
         dgv.Columns.Add("requestTime", "開始時(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)簽頁下方為 DataGridView,實(shí)時(shí)顯示當(dāng)前打印任務(wù),包括來源、任務(wù)ID、任務(wù)名稱、模板、開始時(shí)間、任務(wù)狀態(tài)等信息。

右鍵菜單:支持對(duì)單個(gè)任務(wù)進(jìn)行“取消打印”、“重新打印”、“刪除記錄”等操作。

任務(wù)搜索:支持按任務(wù)ID快速定位任務(wù)。

4. 其他功能

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

因?yàn)镕astReport.Net 是需要購買授權(quán)的,所以我使用的是FastReport.OpenSource(開源版),開源版功能太少,不能直接從程序內(nèi)部調(diào)用FastReport設(shè)計(jì)器和預(yù)覽器,只能通過啟動(dòng)本地安裝的.exe來實(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)置開發(fā)者聯(lián)系方式,便于用戶反饋和技術(shù)支持。

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

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

WMI 打印作業(yè)監(jiān)控:通過 System.Management 命名空間,使用 WMI 查詢 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)聽方法實(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à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秒輪詢
                 }
             }
         }
         catch (Exception ex)
         {
             UpdateTaskStatusOnUI(printerName, taskName, "狀態(tài)監(jiān)聽失敗");
         }
     });
 }

任務(wù)狀態(tài)同步:通過輪詢方式定時(shí)查詢打印隊(duì)列,自動(dòng)更新任務(wù)狀態(tài)(如“正在打印”、“已完成”、“已取消”等),并在 UI 上實(shí)時(shí)反饋。

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

取消打印:通過 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;
     // 查詢打印隊(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);
 }

重新打?。菏状未蛴r(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("未找到原始打印信息,無法重新打印。", "錯(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)通過網(wǎng)絡(luò)下發(fā)打印任務(wù)、查詢狀態(tài)、遠(yuǎn)程控制等。

消息協(xié)議設(shè)計(jì):采用 JSON 協(xié)議,支持多種命令(如 printshow、ping 等),并能將打印結(jié)果、錯(cuò)誤信息實(shí)時(shí)反饋給客戶端。

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)訪問
        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();

            // 獲取來源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ù)名稱為當(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}", // 來源
                                 taskId,                     // 任務(wù)ID
                                 taskName,                   // 任務(wù)名稱
                                 realName,                   // 模板
                                 requestTime,                // 開始時(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)聽打印機(jī)狀態(tài)
            StartMonitorPrintJob(printerName, taskId, taskName);
        }
        else
        {
            // 處理其他cmd
            Console.WriteLine($"收到未知cmd: {cmd}");
        }
    }
    else
    {
        Console.WriteLine($"收到未知消息: {message}");
    }
};

異常處理與反饋:打印過程中如遇異常(如文件不存在、數(shù)據(jù)格式錯(cuò)誤等),會(huì)捕獲異常并通過 WebSocket 回復(fù)詳細(xì)錯(cuò)誤信息,便于外部系統(tǒng)及時(shí)處理。

4. 打印文件類型支持

多格式兼容:支持 TXT、圖片(JPG/PNG/BMP/GIF)、PDF、FastReport 模板(FRX)等多種文件類型的打印。

模板數(shù)據(jù)綁定:對(duì)于報(bào)表類打印,支持將 JSON、DataTable、DataSet 等多種數(shù)據(jù)源動(dòng)態(tài)綁定到模板,實(shí)現(xiàn)靈活的數(shù)據(jù)驅(qū)動(dòng)打印。

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

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

四、總結(jié)

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

以上就是C# WinForms實(shí)現(xiàn)打印監(jiān)聽組件工具的詳細(xì)內(nèi)容,更多關(guān)于C# WinForms打印監(jiān)聽的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • vista和win7在windows服務(wù)中交互桌面權(quán)限問題解決方法:穿透Session 0 隔離

    vista和win7在windows服務(wù)中交互桌面權(quán)限問題解決方法:穿透Session 0 隔離

    服務(wù)(Service)對(duì)于大家來說一定不會(huì)陌生,它是Windows 操作系統(tǒng)重要的組成部分。我們可以把服務(wù)想像成一種特殊的應(yīng)用程序,它隨系統(tǒng)的“開啟~關(guān)閉”而“開始~停止”其工作內(nèi)容,在這期間無需任何用戶參與
    2016-04-04
  • C#逐行分元素讀取記事本數(shù)據(jù)并寫入數(shù)據(jù)庫的方法

    C#逐行分元素讀取記事本數(shù)據(jù)并寫入數(shù)據(jù)庫的方法

    這篇文章主要介紹了C#逐行分元素讀取記事本數(shù)據(jù)并寫入數(shù)據(jù)庫的方法,通過StreamReader類里的ReadLine()方法實(shí)現(xiàn)逐行讀取的功能,是非常實(shí)用的技巧,需要的朋友可以參考下
    2014-12-12
  • WinForm實(shí)現(xiàn)窗體最大化并遮蓋任務(wù)欄的方法

    WinForm實(shí)現(xiàn)窗體最大化并遮蓋任務(wù)欄的方法

    這篇文章主要介紹了WinForm實(shí)現(xiàn)窗體最大化并遮蓋任務(wù)欄的方法,涉及C#實(shí)現(xiàn)WinForm窗體全屏顯示的實(shí)現(xiàn)及調(diào)用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-08-08
  • C#對(duì)Word文檔的創(chuàng)建、插入表格、設(shè)置樣式等操作實(shí)例

    C#對(duì)Word文檔的創(chuàng)建、插入表格、設(shè)置樣式等操作實(shí)例

    今天小編就為大家分享一篇C#對(duì)Word文檔的創(chuàng)建、插入表格、設(shè)置樣式等操作實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • 深入理解C#委托delegate的使用

    深入理解C#委托delegate的使用

    本文主要介紹了C#委托delegate的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • C#中時(shí)間類的使用方法詳解

    C#中時(shí)間類的使用方法詳解

    這篇文章主要介紹C#中的時(shí)間類,文中主要介紹了DateTime類,TimeSpan類,DateTimeOffset類及靜態(tài)類的封裝,通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • C#實(shí)現(xiàn)利用Linq操作Xml文件

    C#實(shí)現(xiàn)利用Linq操作Xml文件

    這篇文章主要為大家詳細(xì)介紹了C#如何利用Linq實(shí)現(xiàn)操作Xml文件,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下
    2022-12-12
  • 詳解C#編程中一維數(shù)組與多維數(shù)組的使用

    詳解C#編程中一維數(shù)組與多維數(shù)組的使用

    這篇文章主要介紹了詳解C#編程中一維數(shù)組與多維數(shù)組的使用,包括數(shù)組初始化等基礎(chǔ)知識(shí)的講解,需要的朋友可以參考下
    2016-01-01
  • C#類的多態(tài)性詳解

    C#類的多態(tài)性詳解

    這篇文章主要為大家詳細(xì)介紹了C#類的多態(tài)性,主要有兩種:一是編譯時(shí)的多態(tài)性,二是運(yùn)行時(shí)的多態(tài)性,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2015-10-10
  • WPF使用WrapPanel實(shí)現(xiàn)虛擬化效果

    WPF使用WrapPanel實(shí)現(xiàn)虛擬化效果

    這篇文章主要為大家詳細(xì)介紹了如何利用WPF WrapPanel實(shí)現(xiàn)虛擬化效果,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定幫助,感興趣的小伙伴可以了解一下
    2022-09-09

最新評(píng)論

沙河市| 开封县| 枞阳县| 寿阳县| 西华县| 安龙县| 阳泉市| 东源县| 小金县| 临猗县| 滦平县| 大冶市| 吉安县| 珠海市| 济宁市| 大埔县| 屯昌县| 什邡市| 商河县| 涡阳县| 武强县| 白朗县| 五华县| 依安县| 西畴县| 璧山县| 庄河市| 合江县| 睢宁县| 织金县| 济南市| 玉门市| 微山县| 邢台市| 漯河市| 精河县| 盖州市| 邓州市| 惠来县| 大埔区| 太湖县|