Winform實(shí)現(xiàn)鼠標(biāo)可穿透的窗體鏤空效果
今天找到一個(gè)名叫LICEcap的錄屏軟件,錄制界面是這樣的:

這個(gè)炫酷的空心窗口就是鏡頭,調(diào)整好大小,然后對(duì)準(zhǔn)需要錄制的地方按下Record就可以生成gif了。
臥槽太NB了我也要做一個(gè)!
根據(jù)StackOverflow站的提示(在這里),我們需要使用一個(gè)在Windows2000及之后平臺(tái)可用的,用以實(shí)現(xiàn)不規(guī)則窗體的分層窗口API (SetLayerWindowAttributes).根據(jù)百度我們先需要使用一個(gè)名為SetWindowLong的Win32 API來(lái)把窗體設(shè)定為分層窗體。
為了在.NET平臺(tái)中調(diào)用Win32 API,我們需要復(fù)習(xí)下P/Invoke的內(nèi)容:
1.什么是P/Invoke
P/Invoke 的全稱(chēng)是Platform Invoke。.是一種在托管平臺(tái)下使用非托管dll中導(dǎo)出函數(shù)的一種調(diào)用機(jī)制。
2.如何用P/Invoke
它長(zhǎng)這樣:
[DllImportAttribute("user32.dll", EntryPoint="SetCursorPos")]
public static extern bool SetCursorPos(int X, int Y) ;
依次指明調(diào)用的dll名稱(chēng),導(dǎo)出函數(shù)名,然后定義成C#標(biāo)準(zhǔn)的方法就行了。
所以,我們需要: 打開(kāi)百度百科,搜索API名稱(chēng),查看宿主dll,抄來(lái)函數(shù)原型,按照說(shuō)明定義需要的常量。
不,我找到了更方便的辦法:打開(kāi)pinvoke.net,搜索API名稱(chēng):

按照里邊的C#Signature復(fù)制過(guò)來(lái),再根據(jù)Sample Code改改,就OK了。
然后在Visual Studio里新建一個(gè)Winform項(xiàng)目,在主窗口代碼里這樣寫(xiě):
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.TopMost = true;
SetWindowLong(this.Handle, GWL_EXSTYLE, WS_EX_LAYERED);
SetLayeredWindowAttributes(this.Handle, 65280, 255, LWA_COLORKEY);
}
private const uint WS_EX_LAYERED = 0x80000;
private const int GWL_EXSTYLE = -20;
private const int LWA_COLORKEY = 1;
[DllImport("user32", EntryPoint = "SetWindowLong")]
private static extern uint SetWindowLong(IntPtr hwnd,int nIndex,uint dwNewLong);
[DllImport("user32", EntryPoint = "SetLayeredWindowAttributes")]
private static extern int SetLayeredWindowAttributes(IntPtr hwnd,int crKey,int bAlpha,int dwFlags);
}
先使用SetWindowLong將窗口定義為分層窗體,然后調(diào)用SetLayeredWindowAttributes方法設(shè)置透明。
其中第二個(gè)參數(shù)crKey為一個(gè)int型的顏色值,轉(zhuǎn)換方式為(int)(0xRRGGBB),本例中Dec(0x00FF00)=65280為綠色。
第四個(gè)參數(shù)為透明方式,本例中使用LWA_COLORKEY = 1,表示將該窗口顏色為crKey的部分都設(shè)置為透明。
因此相應(yīng)地,我們需要在窗口設(shè)計(jì)器中畫(huà)一個(gè)顏色為綠色的方塊。本例中使用了一個(gè)PictureBox,并設(shè)置了背景顏色。

F5運(yùn)行,效果如圖:

能想到的用處之一就是,包裝幾個(gè)不相關(guān)的外部程序?yàn)橐粋€(gè)整體.
- WinForm實(shí)現(xiàn)窗體最大化并遮蓋任務(wù)欄的方法
- C#實(shí)現(xiàn)WinForm禁止最大化、最小化、雙擊標(biāo)題欄、雙擊圖標(biāo)等操作的方法
- Winform窗體效果實(shí)例分析
- WinForm實(shí)現(xiàn)自定義右下角提示效果的方法
- WinForm實(shí)現(xiàn)仿視頻播放器左下角滾動(dòng)新聞效果的方法
- C#實(shí)現(xiàn)winform漸變效果的方法
- WinForm實(shí)現(xiàn)同時(shí)讓兩個(gè)窗體有激活效果的特效實(shí)例
- C# WinForm實(shí)現(xiàn)Win7 Aero透明效果代碼
- winform下實(shí)現(xiàn)win7 Aero磨砂效果實(shí)現(xiàn)代碼
- 用 C# Winform做出全透明的磨砂玻璃窗體效果代碼
- WinForm實(shí)現(xiàn)狀態(tài)欄跑馬燈效果的方法示例
相關(guān)文章
使用C#正則表達(dá)式獲取必應(yīng)每日?qǐng)D片地址
這篇文章主要介紹了使用C#正則表達(dá)式獲取必應(yīng)每日?qǐng)D片地址的相關(guān)資料,需要的朋友可以參考下2017-04-04
C# 大小寫(xiě)轉(zhuǎn)換(金額)實(shí)例代碼
C# 大小寫(xiě)轉(zhuǎn)換(金額)實(shí)例代碼,需要的朋友可以參考一下2013-03-03
c#數(shù)據(jù)綁定之刪除datatable數(shù)據(jù)示例
這篇文章主要介紹了c#刪除datatable數(shù)據(jù)示例,需要的朋友可以參考下2014-04-04
WPF實(shí)現(xiàn)動(dòng)畫(huà)效果(五)之關(guān)鍵幀動(dòng)畫(huà)
這篇文章介紹了WPF實(shí)現(xiàn)動(dòng)畫(huà)效果之關(guān)鍵幀動(dòng)畫(huà),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
C# Windows API應(yīng)用之基于FlashWindowEx實(shí)現(xiàn)窗口閃爍的方法
這篇文章主要介紹了C# Windows API應(yīng)用之基于FlashWindowEx實(shí)現(xiàn)窗口閃爍的方法,結(jié)合實(shí)例形式分析了Windows API函數(shù)FlashWindowEx的功能、定義及實(shí)現(xiàn)窗口閃爍的相關(guān)技巧,需要的朋友可以參考下2016-08-08
c# 實(shí)現(xiàn)窗體拖到屏幕邊緣自動(dòng)隱藏
讓窗體拖到屏幕邊緣自動(dòng)隱藏的原理,通過(guò)Form1_LocationChanged的方法,當(dāng)窗體位置發(fā)生改變時(shí),判斷其是否在屏幕邊緣,在則隱藏。再通過(guò)Timer控件經(jīng)過(guò)指定時(shí)間判斷出鼠標(biāo)的位置,若鼠標(biāo)在屏幕左邊、上邊或右邊,這根據(jù)窗體的位置,調(diào)出窗體。2009-02-02
C#實(shí)現(xiàn)觀察者模式(Observer?Pattern)的兩種方式
這篇文章介紹了C#實(shí)現(xiàn)觀察者模式(Observer?Pattern)的兩種方式,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08
c# WPF實(shí)現(xiàn)Windows資源管理器(附源碼)
這篇文章主要介紹了c# WPF實(shí)現(xiàn)Windows資源管理器的示例(附源碼),幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下2021-03-03

