主頁 > .NET開發 > C# WinForm呼叫Shell_NotifyIcon

C# WinForm呼叫Shell_NotifyIcon

2020-11-20 13:29:31 .NET開發

 1     public class InnerClass: Form
 2     {
 3         private Shell_NotifyIconEx servicesClass = null; // 接受主CLASS 的實體句柄
 4         internal InnerClass(Shell_NotifyIconEx _servicesClass)
 5         {
 6             servicesClass = _servicesClass;
 7         }
 8 
 9         private const int WM_LBUTTONDOWN = 0x0201; // 左鍵
10         private const int WM_RBUTTONDOWN = 0x204; // 右鍵
11         private const int WM_MBUTTONDOWN = 0x207; // 中鍵
12 
13         [DllImport("user32.dll", EntryPoint = "TrackPopupMenu")]
14         private static extern int TrackPopupMenu( // c# 和vb.net 好象沒有了隨地popup 了,只要請它老人家出馬了
15          IntPtr hMenu,
16          int wFlags,
17          int x,
18          int y,
19          int nReserved,
20          IntPtr hwnd,
21          ref RECT lprc
22          );
23 
24         [StructLayout(LayoutKind.Sequential)]
25         private struct RECT
26         { // 上面那位用的結構,表示前彈出選單可用的一個范圍大小(一般是全螢屏都讓它用,留著搞游戲或視頻對話之類的朋友指定選單可用的范圍)
27             internal int Left;
28             internal int Top;
29             internal int Right;
30             internal int Bottom;
31         }
32 
33         protected override void WndProc(ref Message msg)
34         {
35             if (msg.Msg == servicesClass.WM_NOTIFY_TRAY)
36             { // 如果訊息相符
37                 if ((int)msg.WParam == servicesClass.uID)
38                 { // 并且訊息的WParam 相符
39                    MouseButtons mb =MouseButtons.None;
40                     if ((int)msg.LParam == WM_LBUTTONDOWN)
41                     { //如果點擊的是左鍵
42                         mb =MouseButtons.Left;
43                     }
44                     else if ((int)msg.LParam == WM_MBUTTONDOWN)
45                     { //中鍵
46                         mb =MouseButtons.Middle;
47                     }
48                     else if ((int)msg.LParam == WM_RBUTTONDOWN)
49                     { //右鍵
50                         if (servicesClass.contextMenuHwnd != IntPtr.Zero)
51                         { //如果有定義過選單關聯
52                             RECT r = new RECT();
53                             r.Left = Screen.PrimaryScreen.WorkingArea.Left;
54                             r.Right =Screen.PrimaryScreen.WorkingArea.Right;
55                             r.Top =Screen.PrimaryScreen.WorkingArea.Top;
56                             r.Bottom =Screen.PrimaryScreen.WorkingArea.Right;
57 
58                             TrackPopupMenu(
59                              servicesClass.contextMenuHwnd,
60                              2,
61                             Cursor.Position.X,
62                             Cursor.Position.Y,
63                              0,
64                              servicesClass.formHwnd,
65                              ref r
66                              );
67                         }
68                         else
69                         { //如果沒有定義過選單關聯
70                             mb =MouseButtons.Right;
71                         }
72                     }
73 
74                     if (mb !=MouseButtons.None && servicesClass._delegateOfCallBack != null)
75                     {
76                         servicesClass._delegateOfCallBack(mb); // 執行回呼
77                         return;
78                     }
79                 }
80             }
81 
82             base.WndProc(ref msg);
83         }
84     }
  1 public class Shell_NotifyIconEx
  2     {
  3         /// <summary>
  4         /// ArLi, last fix: 2003.9.12, reference: ArLi.CommonPrj Lib @ http://zpcity.com/arli/
  5         /// </summary>
  6         public static readonly System.Version myVersion = new System.Version(1, 2); //版本宣告
  7 
  8         private readonly InnerClass formTmp = null; // 這個很重要,不能放在構造里,因為它必須和此實體同等生存期才不會被中止訊息回圈
  9         private readonly IntPtr formTmpHwnd = IntPtr.Zero; // 這是上一行的句柄
 10         private readonly bool VersionOk = false; // 這是一個由VersionPass 回傳的屬性,它允許開發者檢測當前機子的Shell32.dll(可能在win95 或未知平臺上版本) 合適此組,不符則用.net 自己的notifyicon
 11         private bool forgetDelNotifyBox = false; // 這是一個私有標志,它允許開發者在程式退出時忘記呼叫DelNotifyBox 來清除圖示時會自動在析構里清掉它,
 12 
 13         internal IntPtr formHwnd = IntPtr.Zero; // 這是呼叫此組件的主視窗句柄(當前實體有效,可多個icon 不沖突)
 14         internal IntPtr contextMenuHwnd = IntPtr.Zero; // 這是選單的句柄(當前實體有效,可多個icon 不沖突)
 15 
 16         internal delegate void delegateOfCallBack(System.Windows.Forms.MouseButtons mb);
 17         internal delegateOfCallBack _delegateOfCallBack = null;
 18 
 19         public Shell_NotifyIconEx() // 構造
 20         {
 21             WM_NOTIFY_TRAY += 1; // 訊息ID +1,避免多個ICON 訊息處理沖突
 22             uID += 1; // 同上
 23             formTmp = new InnerClass(this); // 新實體一個訊息回圈
 24             formTmpHwnd = formTmp.Handle; // 新實體句柄
 25             VersionOk = this.GetShell32VersionInfo() >= 5; // 版本是否合適,此組件由于重點在氣泡提示,它要求Shell32.dll 5.0(ie 5.0) 以上
 26         }
 27 
 28         ~Shell_NotifyIconEx()
 29         { // 析構
 30             if (forgetDelNotifyBox) this.DelNotifyBox(); //如果開發者忘記則清理icon
 31         }
 32 
 33         #region API_Consts
 34         internal readonly int WM_NOTIFY_TRAY = 0x0400 + 2001; //readonly 表示只在構造可付值
 35         internal readonly int uID = 5000;
 36 
 37         // 常數定義,有VC 的可以參見 shellapi.h
 38         private const int NIIF_NONE = 0x00;
 39         private const int NIIF_INFO = 0x01;
 40         private const int NIIF_WARNING = 0x02;
 41         private const int NIIF_ERROR = 0x03;
 42 
 43         private const int NIF_MESSAGE = 0x01;
 44         private const int NIF_ICON = 0x02;
 45         private const int NIF_TIP = 0x04;
 46         private const int NIF_STATE = 0x08;
 47         private const int NIF_INFO = 0x10;
 48 
 49         private const int NIM_ADD = 0x00;
 50         private const int NIM_MODIFY = 0x01;
 51         private const int NIM_DELETE = 0x02;
 52         private const int NIM_SETFOCUS = 0x03;
 53         private const int NIM_SETVERSION = 0x04;
 54 
 55         private const int NIS_HIDDEN = 0x01;
 56         private const int NIS_SHAREDICON = 0x02;
 57 
 58         private const int NOTIFYICON_OLDVERSION = 0x00;
 59         private const int NOTIFYICON_VERSION = 0x03;
 60 
 61         [DllImport("shell32.dll", EntryPoint = "Shell_NotifyIcon")]
 62         private static extern bool Shell_NotifyIcon( // 這位是主角
 63             int dwMessage,
 64             ref NOTIFYICONDATA lpData
 65         );
 66 
 67         /// <summary>
 68         /// 此API 的作用是當 this.focus() 無效時可以考慮使用,效果很好
 69         /// </summary>
 70         /// <param name="hwnd">this.Handle, 當前表單句柄</param>
 71         [DllImport("user32.dll", EntryPoint = "SetForegroundWindow")]
 72         public static extern int SetForegroundWindow(
 73             IntPtr hwnd
 74         );
 75 
 76         [StructLayout(LayoutKind.Sequential)]
 77         private struct NOTIFYICONDATA
 78         { // 主角用的結構
 79             internal int cbSize;
 80             internal IntPtr hwnd;
 81             internal int uID;
 82             internal int uFlags;
 83             internal int uCallbackMessage;
 84             internal IntPtr hIcon;
 85             [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x80)]
 86             internal string szTip;
 87             internal int dwState; // 這里往下幾個是 5.0 的精華
 88             internal int dwStateMask;
 89             [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0xFF)]
 90             internal string szInfo;
 91             internal int uTimeoutAndVersion;
 92             [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x40)]
 93             internal string szInfoTitle;
 94             internal int dwInfoFlags;
 95         }
 96         #endregion
 97 
 98         /// <summary>
 99         /// 建一個結構
100         /// </summary>
101         private NOTIFYICONDATA GetNOTIFYICONDATA(IntPtr iconHwnd, string sTip, string boxTitle, string boxText)
102         {
103             NOTIFYICONDATA nData = https://www.cnblogs.com/zhangliang2008/archive/2020/11/20/new NOTIFYICONDATA();
104 
105             nData.cbSize = System.Runtime.InteropServices.Marshal.SizeOf(nData); // 結構的大小
106             nData.hwnd = formTmpHwnd; // 處理訊息回圈的表單句柄,可以移成主表單
107             nData.uID = uID; // 訊息的 WParam,回呼時用
108             nData.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP | NIF_INFO; // 標志,表示由訊息、圖示、提示、資訊組成
109             nData.uCallbackMessage = WM_NOTIFY_TRAY; // 訊息ID,回呼叫
110             nData.hIcon = iconHwnd; // 圖示的句柄,有興趣的話可以定時改變它變成影片ICON
111             nData.uTimeoutAndVersion = 10 * 1000 | NOTIFYICON_VERSION; // 提示的超時值(幾秒后自動消失)和版本
112             nData.dwInfoFlags = NIIF_INFO; // 型別標志,有INFO、WARNING、ERROR,更改此值將影響氣泡提示框的圖示型別
113 
114             nData.szTip = sTip; // 圖示的提示資訊
115             nData.szInfoTitle = boxTitle; // 氣泡提示框的標題
116             nData.szInfo = boxText; // 氣泡提示框的提示內容
117 
118             return nData; // 這個嘛,,,
119         }
120 
121         private int GetShell32VersionInfo()
122         { // 回傳shell32 的版本
123             FileInfo fi = new FileInfo(Path.Combine(System.Environment.SystemDirectory, "shell32.dll")); //將來的平臺shell32 放哪目前不得而知,碰到再改
124             if (fi.Exists)
125             {
126                 FileVersionInfo theVersion = FileVersionInfo.GetVersionInfo(fi.FullName);
127                 int i = theVersion.FileVersion.IndexOf('.');
128                 if (i > 0)
129                 {
130                     try
131                     {
132                         return int.Parse(theVersion.FileVersion.Substring(0, i));
133                     }
134                     catch { }
135                 }
136             }
137             return 0;
138         }
139 
140         /// <summary>
141         /// 加一個新圖示
142         /// </summary>
143         /// <param name="iconHwnd">圖示句柄</param>
144         /// <param name="sTip">提示, 5.0 最大: 128 char</param>
145         /// <param name="boxTitle">氣泡標題, 最大: 64 char</param>
146         /// <param name="boxText">氣泡內容, 最大: 256 char</param>
147         /// <returns>成功、失敗或錯誤(-1)</returns>
148         public int AddNotifyBox(IntPtr iconHwnd, string sTip, string boxTitle, string boxText)
149         {
150             if (!this.VersionOk) return -1;
151 
152             NOTIFYICONDATA nData =https://www.cnblogs.com/zhangliang2008/archive/2020/11/20/ GetNOTIFYICONDATA(iconHwnd, sTip, boxTitle, boxText);
153             if (Shell_NotifyIcon(NIM_ADD, ref nData))
154             {
155                 this.forgetDelNotifyBox = true;
156                 return 1;
157             }
158             else
159             {
160                 return 0;
161             }
162         }
163 
164         /// <summary>
165         /// 和add 差不多,不重復了
166         /// </summary>
167         public int DelNotifyBox()
168         {
169             if (!this.VersionOk) return -1;
170 
171             NOTIFYICONDATA nData = https://www.cnblogs.com/zhangliang2008/archive/2020/11/20/GetNOTIFYICONDATA(IntPtr.Zero, null, null, null);
172             if (Shell_NotifyIcon(NIM_DELETE, ref nData))
173             {
174                 this.forgetDelNotifyBox = false;
175                 return 1;
176             }
177             else
178             {
179                 return 0;
180             }
181         }
182 
183         public int ModiNotifyBox(IntPtr iconHwnd, string sTip, string boxTitle, string boxText)
184         {
185             if (!this.VersionOk) return -1;
186 
187             NOTIFYICONDATA nData =https://www.cnblogs.com/zhangliang2008/archive/2020/11/20/ GetNOTIFYICONDATA(iconHwnd, sTip, boxTitle, boxText);
188             return Shell_NotifyIcon(NIM_MODIFY, ref nData) ? 1 : 0;
189         }
190 
191         #region Optional Module //這里是可選方法
192         /// <summary>
193         /// 連接一個已存在的 contextMenu
194         /// </summary>
195         /// <param name="_formHwnd">表單句柄,用來處理選單的訊息</param>
196         /// <param name="_contextMenuHwnd">選單的句柄</param>
197         public void ConnectMyMenu(IntPtr _formHwnd, IntPtr _contextMenuHwnd)
198         {
199             formHwnd = _formHwnd;
200             contextMenuHwnd = _contextMenuHwnd;
201         }
202 
203         /// <summary>
204         /// 立即清理掉圖示、委托和formtmp 資源(好象沒什么資源,考慮到可能二次開發掛接就開了這個東東)
205         /// </summary>
206         public void Dispose()
207         {
208             _delegateOfCallBack = null;
209             this.formTmp.Dispose();
210         }
211 
212         /// <summary>
213         /// 版本適合
214         /// </summary>
215         public bool VersionPass
216         {
217             get
218             {
219                 return this.VersionOk;
220             }
221         }
222         #endregion
223     }

用法示例:

1 private void button2_Click (object sender, System.EventArgs e) {
2     Shell_NotifyIconEx ().AddNotifyBox (this.Icon.Handle, this.Text, "這是標題", "單擊這里開始,我將帶你暢游API 世界");
3 }
private void GetPoc1 (MouseButtons mb) { // 回呼處理
    if (mb == MouseButtons.Left) {
        MessageBox.Show ("來自選單1");
    }
}
privateShell_NotifyIconEx o1 = newShell_NotifyIconEx (); //這個放外面是用在 o.DelNotifyBox
private void button1_Click (object sender, System.EventArgs e) {
    o1.AddNotifyBox (this.Icon.Handle, this.Text, "選單1", "單擊這里開始,我將帶你暢游API 世界");
    o1.ConnectMyMenu (this.Handle, this.contextMenu1.Handle); // 掛上選單,可選
    o1._delegateOfCallBack = newShell_NotifyIconEx.delegateOfCallBack (GetPoc1); //定義回呼
}
private void GetPoc1(MouseButtons mb) { // 回呼處理
   if (mb == MouseButtons.Left) {
    MessageBox.Show("來自選單1");
   }
  }
  private Shell_NotifyIconEx o1 = new Shell_NotifyIconEx(); //這個放外面是用在 o.DelNotifyBox
  private void button1_Click(object sender, System.EventArgs e) {
   o1.AddNotifyBox(this.Icon.Handle,this.Text,"選單1","單擊這里開始,我將帶你暢游API 世界");   
   o1.ConnectMyMenu(this.Handle,this.contextMenu1.Handle); // 掛上選單,可選
   o1._delegateOfCallBack = new Shell_NotifyIconEx.delegateOfCallBack(GetPoc1); //定義回呼
  }
  private void GetPoc2(MouseButtons mb) {
   if (mb == MouseButtons.Left) {
    MessageBox.Show("來自選單2");
   }
  }
  private Shell_NotifyIconEx o2 = new Shell_NotifyIconEx(); //第二個nofityicon 和上面一樣
  private void button2_Click(object sender, System.EventArgs e) {
   o2.AddNotifyBox(this.Icon.Handle,this.Text,"選單2","單擊這里開始,我將帶你暢游API 世界");   
   o2.ConnectMyMenu(this.Handle,this.contextMenu2.Handle);
   o2._delegateOfCallBack = new Shell_NotifyIconEx.delegateOfCallBack(GetPoc2);
  }

本文來自:http://blog.sina.com.cn/s/blog_6c0affba0100pi0e.html

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/225458.html

標籤:.NET技术

上一篇:(7)ASP.NET Core3.1 Ocelot Swagger

下一篇:C# WinForm呼叫Shell_NotifyIcon

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more