Winform實現(xiàn)鼠標(biāo)可穿透的窗體鏤空效果
今天找到一個名叫LICEcap的錄屏軟件,錄制界面是這樣的:
這個炫酷的空心窗口就是鏡頭,調(diào)整好大小,然后對準需要錄制的地方按下Record就可以生成gif了。
臥槽太NB了我也要做一個!
根據(jù)StackOverflow站的提示(在這里),我們需要使用一個在Windows2000及之后平臺可用的,用以實現(xiàn)不規(guī)則窗體的分層窗口API (SetLayerWindowAttributes).根據(jù)百度我們先需要使用一個名為SetWindowLong的Win32 API來把窗體設(shè)定為分層窗體。
為了在.NET平臺中調(diào)用Win32 API,我們需要復(fù)習(xí)下P/Invoke的內(nèi)容:
1.什么是P/Invoke
P/Invoke 的全稱是Platform Invoke。.是一種在托管平臺下使用非托管dll中導(dǎo)出函數(shù)的一種調(diào)用機制。
2.如何用P/Invoke
它長這樣:
[DllImportAttribute("user32.dll", EntryPoint="SetCursorPos")] public static extern bool SetCursorPos(int X, int Y) ;
依次指明調(diào)用的dll名稱,導(dǎo)出函數(shù)名,然后定義成C#標(biāo)準的方法就行了。
所以,我們需要: 打開百度百科,搜索API名稱,查看宿主dll,抄來函數(shù)原型,按照說明定義需要的常量。
不,我找到了更方便的辦法:打開pinvoke.net,搜索API名稱:
按照里邊的C#Signature復(fù)制過來,再根據(jù)Sample Code改改,就OK了。
然后在Visual Studio里新建一個Winform項目,在主窗口代碼里這樣寫:
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è)置透明。
其中第二個參數(shù)crKey為一個int型的顏色值,轉(zhuǎn)換方式為(int)(0xRRGGBB),本例中Dec(0x00FF00)=65280為綠色。
第四個參數(shù)為透明方式,本例中使用LWA_COLORKEY = 1,表示將該窗口顏色為crKey的部分都設(shè)置為透明。
因此相應(yīng)地,我們需要在窗口設(shè)計器中畫一個顏色為綠色的方塊。本例中使用了一個PictureBox,并設(shè)置了背景顏色。
F5運行,效果如圖:
能想到的用處之一就是,包裝幾個不相關(guān)的外部程序為一個整體.
欄 目:C#教程
本文標(biāo)題:Winform實現(xiàn)鼠標(biāo)可穿透的窗體鏤空效果
本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/6237.html
您可能感興趣的文章
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實現(xiàn)txt定位指定行完整實例
- 01-10WinForm實現(xiàn)仿視頻 器左下角滾動新聞效果的方法
- 01-10C#實現(xiàn)清空回收站的方法
- 01-10C#實現(xiàn)讀取注冊表監(jiān)控當(dāng)前操作系統(tǒng)已安裝軟件變化的方法
- 01-10C#實現(xiàn)多線程下載文件的方法
- 01-10C#實現(xiàn)Winform中打開網(wǎng)頁頁面的方法
- 01-10C#實現(xiàn)遠程關(guān)閉計算機或重啟計算機的方法
- 01-10C#自定義簽名章實現(xiàn)方法


閱讀排行
本欄相關(guān)
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實現(xiàn)txt定位指定行完整實例
- 01-10WinForm實現(xiàn)仿視頻 器左下角滾動新
- 01-10C#停止線程的方法
- 01-10C#實現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實現(xiàn)讀取注冊表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機閱讀
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-11ajax實現(xiàn)頁面的局部加載
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10C#中split用法實例總結(jié)
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 04-02jquery與jsp,用jquery
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-10delphi制作wav文件的方法
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文