欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C# WinForm實(shí)現(xiàn)鼠標(biāo)穿透功能

 更新時間:2023年11月30日 10:14:18   作者:yue008  
在WinForm開發(fā)時,會用到這樣一個場景,給屏幕增加水印Logo,但不影響畫面的操作,這里就會用到鼠標(biāo)穿透功能,下面我們就來學(xué)習(xí)一下鼠標(biāo)穿透功能的具體實(shí)現(xiàn)吧

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] hWndHWND窗口的句柄,以及窗口所屬類的間接句柄。
[in] nIndexint要設(shè)置的值的從零開始的偏移量。 有效值在零到額外窗口內(nèi)存的字節(jié)數(shù)之間,減去整數(shù)的大小。 若要設(shè)置任何其他值,請指定以下值之一。
[in]dwNewLongLONG替換值

其中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] hWndHWND窗口的句柄,以及窗口所屬類的間接句柄。
[in] nIndexint要檢索的值的從零開始的偏移量。 有效值的范圍是零到額外窗口內(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] hWndHWND分層窗口的句柄。 使用 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] crKeyCOLORREFCOLORREF 結(jié)構(gòu),指定要在組合分層窗口時使用的透明度顏色鍵。 窗口以這種顏色繪制的所有像素都是透明的。 若要生成 COLORREF,請使用 RGB 宏。
[in]bAlphaBYTE用于描述分層窗口的不透明度的 Alpha 值。 類似于 BLENDFUNCTION 結(jié)構(gòu)的 SourceConstantAlpha 成員。 當(dāng) bAlpha 為 0 時,窗口是完全透明的。 當(dāng) bAlpha 為 255 時,窗口是不透明的。
[in]dwFlagsDWORD要執(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)文章

最新評論