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 的全稱是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名稱,導(dǎo)出函數(shù)名,然后定義成C#標(biāo)準(zhǔn)的方法就行了。
所以,我們需要: 打開百度百科,搜索API名稱,查看宿主dll,抄來(lái)函數(shù)原型,按照說(shuō)明定義需要的常量。
不,我找到了更方便的辦法:打開pinvoke.net,搜索API名稱:
按照里邊的C#Signature復(fù)制過(guò)來(lái),再根據(jù)Sample Code改改,就OK了。
然后在Visual Studio里新建一個(gè)Winform項(xiàng)目,在主窗口代碼里這樣寫:
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ì)器中畫一個(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#畫筆使用復(fù)合數(shù)組繪制單個(gè)矩形的方法
這篇文章主要介紹了C#畫筆使用復(fù)合數(shù)組繪制單個(gè)矩形的方法,涉及C#使用畫筆繪制圖形的相關(guān)技巧,需要的朋友可以參考下2015-06-06Unity Shader實(shí)現(xiàn)線框效果的制作步驟
最近比較忙,今天抽空給大家分享一篇文章,關(guān)于Unity Shader實(shí)現(xiàn)線框效果,本文給大家分享詳細(xì)制作步驟,通過(guò)圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2021-06-06C#使用DES和AES實(shí)現(xiàn)加密解密功能示例
這篇文章主要介紹了C#使用DES和AES實(shí)現(xiàn)加密解密功能,結(jié)合具體實(shí)例形式分析了C#實(shí)現(xiàn)DES與AES的加密解密功能實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-06-06