C#實(shí)現(xiàn)標(biāo)題閃爍效果的示例代碼
在Windows系統(tǒng)中,當(dāng)程序在后臺(tái)運(yùn)行時(shí),如果某個(gè)窗體的提示信息需要用戶瀏覽,該窗體就會(huì)不停地閃爍,這樣就會(huì)吸引用戶的注意。同樣,如果在自己的程序中使某個(gè)窗體不停地閃爍也會(huì)吸引用戶的注意。
1.API函數(shù)FlashWindow
API函數(shù)FlashWindow用于閃爍窗口。該函數(shù)通過(guò)在窗口上顯示和隱藏光標(biāo)來(lái)實(shí)現(xiàn)閃爍效果。
(1)添加命名空間
在C#中,可以調(diào)用Windows API中的FlashWindow函數(shù)。首先添加以下命名空間以使用DllImport特性:
using System.Runtime.InteropServices;
(2)聲明DllImport方法
接下來(lái),聲明FlashWindow函數(shù)的DllImport方法:
[DllImport("user32.dll", SetLastError = true)] public static extern bool FlashWindow(IntPtr hWnd, bool bInvert);
聲明DllImport時(shí),VS會(huì)提示警告信息:SYS1054,并建議修改為L(zhǎng)ibraryImport。不要理睬,因?yàn)樾薷暮蟾鼑?yán)重。作者認(rèn)為不是微軟的普遍性建議錯(cuò)了,而是最新的LibraryImport不適合C++的原生方法FlashWindow(C++跟不上發(fā)展了)。對(duì)于FlashWindow只能使用古老的DllImport P/Invoke 源生成器 。
(3)FlashWindow函數(shù)
現(xiàn)在,您可以使用以下示例代碼在C#中使用FlashWindow函數(shù):
// 讓窗體閃爍起來(lái) using System.Runtime.InteropServices; namespace _168_2 { class Program { [DllImport("user32.dll", SetLastError = true)] public static extern bool FlashWindow(IntPtr hWnd, bool bInvert); [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)] public static extern IntPtr FindWindow(string? lpClassName, string lpWindowName); static void Main(string[] args) { ArgumentNullException.ThrowIfNull(args); // 獲取當(dāng)前窗口的句柄 IntPtr hWnd = FindWindow(null, "新建文本文檔 - 記事本"); if (hWnd != IntPtr.Zero) { while (true) { // 閃爍窗口 FlashWindow(hWnd, true); Console.WriteLine("窗口閃爍成功!"); // 等待2秒鐘 Thread.Sleep(2000); } } else { Console.WriteLine("未找到指定的窗口。"); } Console.ReadKey(); } } }
本實(shí)例運(yùn)行之前,打開(kāi)一個(gè)記事本文件,空白的,其標(biāo)題欄顯示:"新建文本文檔 - 記事本"。然后運(yùn)行本程序,如果找到了這個(gè)記事本文件,控制臺(tái)顯示“窗口閃爍成功”并記事本文件的的標(biāo)題欄同步閃爍。否則,結(jié)果相反。
2.P/Invoke
P/Invoke(Platform Invoke)是一種由.NET框架提供的技術(shù),用于調(diào)用本機(jī)代碼(即非托管代碼)。它允許托管應(yīng)用程序(即由.NET運(yùn)行時(shí)管理的代碼)訪問(wèn)本機(jī)API函數(shù),例如Windows API函數(shù)。
當(dāng)托管應(yīng)用程序使用P/Invoke調(diào)用本機(jī)函數(shù)時(shí),.NET運(yùn)行時(shí)會(huì)將托管代碼與本機(jī)代碼之間進(jìn)行轉(zhuǎn)換,確保兩種類型的代碼可以相互交互。這涉及處理諸如內(nèi)存分配,數(shù)據(jù)類型和異常處理等底層細(xì)節(jié)。
為了使用P/Invoke,需要使用DllImport屬性將本機(jī)函數(shù)導(dǎo)入托管代碼中。DllImport屬性指示該函數(shù)的名稱,它所在的庫(kù)以及傳遞給該函數(shù)的參數(shù)的類型。一旦導(dǎo)入了本機(jī)函數(shù),就可以像調(diào)用托管函數(shù)一樣調(diào)用它。但是,需要確保本機(jī)函數(shù)的簽名與在DllImport屬性中指定的簽名匹配,包括參數(shù)的數(shù)量和類型以及返回類型。
3.再來(lái)一個(gè)示例
本實(shí)例設(shè)計(jì)了一個(gè)閃爍的窗體標(biāo)題欄,運(yùn)行本實(shí)例,單擊“開(kāi)始閃爍”按鈕,窗體標(biāo)題欄就會(huì)不停地閃爍;單擊“停止閃爍”按鈕,窗體標(biāo)題欄就會(huì)停止閃爍。
// 閃爍的標(biāo)題欄 using System.Windows.Forms; namespace _168 { public partial class Form1 : Form { private PictureBox? pictureBox1; private Button? button1; private Button? button2; private System.Windows.Forms.Timer? timer1; public Form1() { InitializeComponent(); StartPosition = FormStartPosition.CenterScreen; Load += Form1_Load; } //重寫(xiě)API函數(shù),用來(lái)實(shí)現(xiàn)窗體標(biāo)題欄閃爍功能 [System.Runtime.InteropServices.DllImport("user32.dll")] public static extern bool FlashWindow(IntPtr handle, bool bInvert); private void Timer1_Tick(object? sender, EventArgs e) { FlashWindow(Handle, true);//啟用窗體閃爍函數(shù) } private void Button1_Click(object? sender, EventArgs e) { timer1!.Enabled = true;//啟動(dòng)計(jì)時(shí)器 } private void Button2_Click(object? sender, EventArgs e) { timer1!.Enabled = false;//關(guān)閉計(jì)時(shí)器 } private void Form1_Load(object? sender, EventArgs e) { // // button1 // button1 = new Button { Location = new Point(45, 50), Name = "button1", Size = new Size(75, 23), TabIndex = 1, Text = "開(kāi)始閃爍", UseVisualStyleBackColor = true }; button1.Click += new EventHandler(Button1_Click); // // button2 // button2 = new Button { Location = new Point(150, 50), Name = "button2", Size = new Size(75, 23), TabIndex = 2, Text = "停止閃爍", UseVisualStyleBackColor = true }; button2.Click += new EventHandler(Button2_Click); // // pictureBox1 // pictureBox1 = new PictureBox { Dock = DockStyle.Fill, Location = new Point(0, 0), Name = "pictureBox1", Size = new Size(325, 127), TabIndex = 0, TabStop = false }; pictureBox1.Controls.Add(button2); pictureBox1.Controls.Add(button1); // // timer1 // timer1 = new System.Windows.Forms.Timer(components); timer1.Tick += new EventHandler(Timer1_Tick); // // Form1 // AutoScaleDimensions = new SizeF(7F, 17F); AutoScaleMode = AutoScaleMode.Font; ClientSize = new Size(266, 155); Controls.Add(pictureBox1); Name = "Frm_Main"; Name = "Form1"; Text = "閃爍的標(biāo)題欄"; ResumeLayout(false); } } }
以上就是C#實(shí)現(xiàn)標(biāo)題閃爍效果的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于C#標(biāo)題閃爍的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#中PuppeteerSharp庫(kù)的應(yīng)用詳解
PuppeteerSharp是一個(gè)針對(duì)Google Chrome瀏覽器的高級(jí)API庫(kù),這篇文章主要為大家詳細(xì)介紹了PuppeteerSharp庫(kù)在C#中的具體應(yīng)用,需要的小伙伴可以了解下2024-01-01C# winform編程中響應(yīng)回車(chē)鍵的實(shí)現(xiàn)代碼
這篇文章主要介紹了C# winform編程中響應(yīng)回車(chē)鍵的實(shí)現(xiàn)代碼,既在窗口上響應(yīng)回車(chē)鍵事件的方法,需要的朋友可以參考下2014-08-08Unity3D實(shí)現(xiàn)列表分頁(yè)效果
這篇文章主要為大家詳細(xì)介紹了Unity3D實(shí)現(xiàn)列表分頁(yè)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04