程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> Winform實現鼠標可穿透的窗體镂空效果,winform镂空

Winform實現鼠標可穿透的窗體镂空效果,winform镂空

編輯:關於.NET

Winform實現鼠標可穿透的窗體镂空效果,winform镂空


  今天找到一個名叫LICEcap的錄屏軟件,錄制界面是這樣的: 

       

  這個炫酷的空心窗口就是鏡頭,調整好大小,然後對准需要錄制的地方按下Record就可以生成gif了。

 

  臥槽太NB了我也要做一個!

 

  根據StackOverflow站的提示(在這裡),我們需要使用一個在Windows2000及之後平台可用的,用以實現不規則窗體的分層窗口API (SetLayerWindowAttributes).根據百度我們先需要使用一個名為SetWindowLong的Win32 API來把窗體設定為分層窗體。

 

  為了在.NET平台中調用Win32 API,我們需要復習下P/Invoke的內容:

  • 1.什麼是P/Invoke

  P/Invoke 的全稱是Platform Invoke。.是一種在托管平台下使用非托管dll中導出函數的一種調用機制。

  • 2.如何用P/Invoke

  它長這樣:

[DllImportAttribute("user32.dll", EntryPoint="SetCursorPos")]
 public static extern  bool SetCursorPos(int X, int Y) ;

  依次指明調用的dll名稱,導出函數名,然後定義成C#標准的方法就行了。

 

  所以,我們需要: 打開百度百科,搜索API名稱,查看宿主dll,抄來函數原型,按照說明定義需要的常量。

  不,我找到了更方便的辦法:打開pinvoke.net,搜索API名稱:

    

  按照裡邊的C#Signature復制過來,再根據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將窗口定義為分層窗體,然後調用SetLayeredWindowAttributes方法設置透明。

  其中第二個參數crKey為一個int型的顏色值,轉換方式為(int)(0xRRGGBB),本例中Dec(0x00FF00)=65280為綠色。

  第四個參數為透明方式,本例中使用LWA_COLORKEY = 1,表示將該窗口顏色為crKey的部分都設置為透明。

  因此相應地,我們需要在窗口設計器中畫一個顏色為綠色的方塊。本例中使用了一個PictureBox,並設置了背景顏色。

 

    

 

    F5運行,效果如圖:

 

    

    能想到的用處之一就是,包裝幾個不相關的外部程序為一個整體.

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved