C# WinForm實(shí)現(xiàn)鼠標(biāo)穿透功能
C#鼠標(biāo)穿透功能(WinForm)
在WinForm開發(fā)時,會用到這樣一個場景,給屏幕增加水印Logo,但不影響畫面的操作。這里就會用到鼠標(biāo)穿透功能。
User32.Dll函數(shù)
要想實(shí)現(xiàn)鼠標(biāo)穿透功能,需要用到User32.Dll的幾個函數(shù):SetWindowLong、GetWindowLong、SetLayeredWindowAttributes。
SetWindowLong
語法規(guī)則
LONG SetWindowLongA( [in] HWND hWnd, [in] int nIndex, [in] LONG dwNewLong );
描述:更改指定窗口的屬性。 函數(shù)還將指定偏移量的 32 位 (長) 值設(shè)置為額外的窗口內(nèi)存。
參數(shù) | 類型 | 描述 |
---|---|---|
[in] hWnd | HWND | 窗口的句柄,以及窗口所屬類的間接句柄。 |
[in] nIndex | int | 要設(shè)置的值的從零開始的偏移量。 有效值在零到額外窗口內(nèi)存的字節(jié)數(shù)之間,減去整數(shù)的大小。 若要設(shè)置任何其他值,請指定以下值之一。 |
[in]dwNewLong | LONG | 替換值 |
其中nIndex的值含義如下,常用到值為GWL_EXSTYLE=(-20)和GWL_STYLE=(-16)
值 | 含義 |
---|---|
GWL_EXSTYLE-20 | 設(shè)置新的 擴(kuò)展窗口樣式 |
GWL_HINSTANCE-6 | 設(shè)置新的應(yīng)用程序?qū)嵗浔?/td> |
GWL_ID-12 | 設(shè)置子窗口的新標(biāo)識符。 該窗口不能是頂級窗口。 |
GWL_STYLE-16 | 設(shè)置新 窗口樣式 |
GWL_USERDATA-21 | 設(shè)置與窗口關(guān)聯(lián)的用戶數(shù)據(jù)。 此數(shù)據(jù)供創(chuàng)建窗口的應(yīng)用程序使用。 其值最初為零。 |
GWL_WNDPROC-4 | 為窗口過程設(shè)置新地址。如果窗口不屬于調(diào)用線程所在的進(jìn)程,則無法更改此屬性。 |
返回值:Long
如果函數(shù)成功,則返回值是指定 32 位整數(shù)的上一個值。
如果函數(shù)失敗,則返回值為零。 要獲得更多的錯誤信息,請調(diào)用 GetLastError。
如果指定的 32 位整數(shù)的上一個值為零,并且函數(shù)成功,則返回值為零,但函數(shù)不會清除最后一個錯誤信息。 這使得很難確定成功或失敗。 若要處理此問題,在調(diào)用 SetWindowLong 之前,應(yīng)通過調(diào)用 SetLastError 0 來清除最后一個錯誤信息。 然后,函數(shù)失敗將由返回值零和 GetLastError 結(jié)果指示為非零。
目前基本不做判斷
GetWindowLong
語法規(guī)則
LONG GetWindowLongA( [in] HWND hWnd, [in] int nIndex );
描述:
檢索有關(guān)指定窗口的信息。 該函數(shù)還會檢索 32 位 (DWORD) 指定偏移量到額外窗口內(nèi)存的值。
參數(shù) | 類型 | 描述 |
---|---|---|
[in] hWnd | HWND | 窗口的句柄,以及窗口所屬類的間接句柄。 |
[in] nIndex | int | 要檢索的值的從零開始的偏移量。 有效值的范圍是零到額外窗口內(nèi)存的字節(jié)數(shù)減去 4;例如,如果指定了 12 個或更多字節(jié)的額外內(nèi)存,則值 8 將是第三個 32 位整數(shù)的索引。 若要檢索任何其他值,請指定以下值之一。 |
其中nIndex的值含義如下,常用到值為GWL_EXSTYLE=(-20)和GWL_STYLE=(-16)
值 | 含義 |
---|---|
GWL_EXSTYLE-20 | 檢索 擴(kuò)展窗口樣式 |
GWL_HINSTANCE-6 | 檢索應(yīng)用程序?qū)嵗木浔?/td> |
GWL_HWNDPARENT-8 | 檢索父窗口的句柄(如果有)。 |
GWL_ID-12 | 檢索窗口的標(biāo)識符。 |
GWL_STYLE-16 | 檢索 窗口樣式 |
GWL_USERDATA-21 | 檢索與窗口關(guān)聯(lián)的用戶數(shù)據(jù)。 此數(shù)據(jù)供創(chuàng)建窗口的應(yīng)用程序使用。 其值最初為零。 |
GWL_WNDPROC-4 | 檢索窗口過程的地址,或表示窗口過程地址的句柄。 必須使用 CallWindowProc函數(shù)調(diào)用窗口過程。 |
返回值
類型: LONG
如果函數(shù)成功,則返回值為請求的值。
如果函數(shù)失敗,則返回值為零。 要獲得更多的錯誤信息,請調(diào)用 GetLastError。
如果以前未調(diào)用 SetWindowLong , 則 GetWindowLong 為額外窗口或類內(nèi)存中的值返回零。
SetLayeredWindowAttributes
語法規(guī)則
BOOL SetLayeredWindowAttributes( [in] HWND hwnd, [in] COLORREF crKey, [in] BYTE bAlpha, [in] DWORD dwFlags );
描述:設(shè)置分層窗口的不透明度和透明度顏色鍵。
參數(shù) | 類型 | 描述 |
---|---|---|
[in] hWnd | HWND | 分層窗口的句柄。 使用 CreateWindowEx 函數(shù)創(chuàng)建窗口時指定WS_EX_LAYERED,或者在創(chuàng)建窗口后通過 SetWindowLong 設(shè)置WS_EX_LAYERED來創(chuàng)建分層窗口。 Windows 8: 頂級窗口和子窗口支持 WS_EX_LAYERED 樣式。 以前的 Windows 版本僅支持 頂級窗口WS_EX_LAYERED 。 |
[in] crKey | COLORREF | COLORREF 結(jié)構(gòu),指定要在組合分層窗口時使用的透明度顏色鍵。 窗口以這種顏色繪制的所有像素都是透明的。 若要生成 COLORREF,請使用 RGB 宏。 |
[in]bAlpha | BYTE | 用于描述分層窗口的不透明度的 Alpha 值。 類似于 BLENDFUNCTION 結(jié)構(gòu)的 SourceConstantAlpha 成員。 當(dāng) bAlpha 為 0 時,窗口是完全透明的。 當(dāng) bAlpha 為 255 時,窗口是不透明的。 |
[in]dwFlags | DWORD | 要執(zhí)行的操作。 此參數(shù)可使用以下一個或多個值。 |
值 | 含義 |
---|---|
LWA_ALPHA0x00000002 | 使用 bAlpha 確定分層窗口的不透明度。 |
LWA_COLORKEY0x00000001 | 使用 crKey 作為透明度顏色。 |
第二個就是要設(shè)置的一個透明色,第三個是要設(shè)置的透明度,bAlpha的范圍是 0-255,如果是0,那么完全透明,如果是255,是完全不透明。 第四個參數(shù),就是設(shè)置是按照透明色來透明,還是按照bAlpha來透明。或者兩個都設(shè)置。 如果 dwFlags 設(shè)置了LWA_COLORKEY,那么crKey就起作用,窗口中所有的crKey顏色區(qū)域就會全部透明,如果dwFlags設(shè)置了LWA_ALPHA,那么bAlpha就會起作用,整個窗口就會按照bAlpha的值來透明。也可以這兩個一起設(shè)置來同時實(shí)現(xiàn)這兩個效果。
功能代碼
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace demo189_窗體移動 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } //定義user32.dll參數(shù)值 private const uint WS_EX_LAYERED = 0x80000; private const int WS_EX_TRANSPARENT = 0x20; private const int GWL_STYLE = (-16); private const int GWL_EXSTYLE = (-20); private const int LWA_ALPHA = 0; //更改指定窗口的屬性 [DllImport("user32", EntryPoint = "SetWindowLong")] private static extern uint SetWindowLong(IntPtr hwnd,int nIndex,uint dwNewLong ); //檢索有關(guān)指定窗口的信息 [DllImport("user32", EntryPoint = "GetWindowLong")] private static extern uint GetWindowLong(IntPtr hwnd,int nIndex ); //設(shè)置分層窗口的不透明度和透明度顏色鍵 [DllImport("user32", EntryPoint = "SetLayeredWindowAttributes")] private static extern int SetLayeredWindowAttributes(IntPtr hwnd,int crKey,int bAlpha,int dwFlags ); /// <summary> /// 設(shè)置窗體具有鼠標(biāo)穿透效果 /// </summary> public void SetPenetrate() { this.TopMost = true; //GetWindowLong(this.Handle, GWL_EXSTYLE); SetWindowLong(this.Handle, GWL_EXSTYLE, WS_EX_TRANSPARENT | WS_EX_LAYERED); SetLayeredWindowAttributes(m_hWnd,0,(BYTE)220,LWA_ALPHA); //SetLayeredWindowAttributes(m_hWnd,RGB(255,0,255),(BYTE)220,LWA_ALPHA|LWA_COLORKEY); //SetLayeredWindowAttributes(m_hWnd,RGB(0,255,0),0,LWA_COLORKEY); } private void Form1_Load(object sender, EventArgs e) { this.Opacity = 0.7; SetPenetrate(); } } }
到此這篇關(guān)于C# WinForm實(shí)現(xiàn)鼠標(biāo)穿透功能的文章就介紹到這了,更多相關(guān)C#鼠標(biāo)穿透內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
javascript函數(shù)中執(zhí)行c#函數(shù)的方法
這篇文章主要介紹了javascript和c#函數(shù)和變量互相調(diào)用的方法,大家參考使用吧2014-01-01C#控制臺程序的開發(fā)與打包為一個exe文件實(shí)例詳解
所謂控制臺程序,就是沒有界面,運(yùn)行程序后只有一個黑色的類似cmd窗口,通過這個窗口進(jìn)行交互,下面這篇文章主要給大家介紹了關(guān)于C#控制臺程序的開發(fā)與打包為一個exe文件的相關(guān)資料,需要的朋友可以參考下2023-05-05C#取得Web程序和非Web程序的根目錄的N種取法總結(jié)
C#取得Web程序和非Web程序的根目錄的N種取法,方便大家知道,有更好的方法,請說明2008-03-03C#實(shí)現(xiàn)文件斷點(diǎn)續(xù)傳下載的方法
這篇文章主要介紹了C#實(shí)現(xiàn)文件斷點(diǎn)續(xù)傳下載的方法,涉及網(wǎng)絡(luò)文件操作的相關(guān)技巧,非常具有實(shí)用價值,需要的朋友可以參考下2015-05-05