日期:2014-06-10 浏览次数:20656 次
【实例说明】
用户在对桌面进行操作时,为了使桌面更加美观,可以在桌面的上面加一层类似于玻璃的效果,用户可以用鼠标透过“玻璃”对桌面进行操作。
本实例通过使用鼠标穿透窗体来实现以上功能。
【关键技术】
本实例实现时主要用到了API函数SetWindowLong和GetWindowLong,下面分别对他们进行详细的讲解。
(1)SetWindowLong函数:该函数主要用于在窗口结构中为指定的窗口设置信息。语法格式如下:
1 [DllImport("user32", EntryPoint = "SetWindowLong")] 2 private static extern uint SetWindowLong(IntPtr hwnd, int nIndex, uint dwNewLong);
(2)GetWindowLong函数:该函数主要从指定窗口的结构中取得信息。语法格式如下:
1 [DllImport("user32", EntryPoint = "GetWindowLong")] 2 private static extern uint GetWindowLong(IntPtr hwnd, int nIndex);
【设计过程】
(1)打开Visual Studio,新建WinForm应用程序,命名为MouseThroughForm。
(2)更改默认窗体Form1的Name属性为Frm_Main,并将该窗体的FormBorderStyle属性设置为None。
(3)在Frm_Main窗体中添加一个NotifyIcon控件,并设置Icon属性为指定的图标,用来显示提示信息。
(4)添加一个ContextMenuStrip控件,用来作为程序的快捷菜单。
(5)Frm_Main窗体中,首先自顶一个方法CanPenetrate,该方法用来通过API函数SetWindowLong和GetWindowLong来实现鼠标的穿透效果。
窗体实现代码如下:
1 using System; 2 using System.Collections.Generic; 3 using System.Drawing; 4 using System.Linq; 5 using System.Windows.Forms; 6 using System.Runtime.InteropServices; 7 8 namespace MouseThroughForm 9 { 10 public partial class Frm_Main : Form 11 { 12 public Frm_Main() 13 { 14 InitializeComponent(); 15 } 16 17 private const uint WS_EX_LAYERED = 0x80000; 18 private const int WS_EX_TRANSPARENT = 0x20; 19 private const int GWL_EXSTYLE = (-20); 20 private string Var_genre = "";//记录当前操作的类型 21 22 #region 在窗口结构中为指定的窗口设置信息 23 /// <summary> 24 /// 在窗口结构中为指定的窗口设置信息 25 /// </summary> 26 /// <param name="hwnd">欲为其取得信息的窗口的句柄</param> 27 /// <param name="nIndex">欲取回的信息</param> 28 /// <param name="dwNewLong">由nIndex指定的窗口信息的新值</param> 29 /// <returns></returns> 30 [DllImport("user32", EntryPoint = "SetWindowLong")] 31 private static extern uint SetWindowLong(IntPtr hwnd, int nIndex, uint dwNewLong); 32 #endregion 33 34 #region 从指定窗口的结构中取得信息 35 /// <summary> 36 /// 从指定窗口的结构中取得信息 37 /// </summary> 38 /// <param name="hwnd">欲为其获取信息的窗口的句柄</param> 39 /// <param name="nIndex">欲取回的信息</param> 40 /// <returns></returns> 41 [DllImport("user32", EntryPoint = "GetWindowLong")] 42 private static extern uint GetWindowLong(IntPtr hwnd, int nIndex); 43 #endregion 44 45 #region 使窗口有鼠标穿透功能 46 /// <summary> 47 /// 使窗口有鼠标穿透功能 48 /// </summary> 49 private void CanPenetrate() 50 { 51 uint intExTemp = GetWindowLong(this.Handle, GWL_EXSTYLE); 52 uint oldGWLEx = SetWindowLong(this.Handle, GWL_EXSTYLE, WS_EX_TRANSPARENT | WS_EX_LAYERED); 53 } 54 #endregion 55 56 private void Frm_Main_Load(object sender, EventArgs e) 57 { 58 this.ShowInTaskbar = false;//窗体不出现在Windows任务栏中 59 CanPenetrate(); 60 this.TopMost = true;//使窗体始终在其它窗体之上 61 } 62 63 #region 设置颜色和透明度的状态 64 /// <summary> 65 /// 设置颜色和透明度的状态 66 /// </summary> 67 private void SetEstate(Form Frm, object sender) 68 { 69 Var_genre = ((ToolStripMenuItem)sender).Name; 70 string Tem_Str = Var_genre; 71 if (Var_genre.IndexOf('_') >= 0) 72 { 73 Var_genre = Tem_Str.Substring(0, Tem_Str.IndexOf('_')); 74 } 75 76 switch (Var_genre) 77 { 78 case "ToolColor": 79 { 80 Color Tem_Color=Color.Gainsboro; 81 switch (Convert.ToInt32(((ToolStripMenuItem)sender).Tag.ToString())) 82 { 83 case 1: Tem_Color = Color.Gainsboro; break; 84 case 2: Tem_Color = Color.DarkOrchid; break; 85 case 3: Tem_Color = Color.RoyalBlue; break; 86 case 4: Tem_Color = Color.Gold; break; 87 case 5: Tem_Color = Color.LightGreen; break; 88 } 89 Frm.BackColor = Tem_Color; 90 break; 91 } 92 case "ToolClarity": 93 { 94 double Tem_Double = 0.0; 95 switch (Convert.ToInt32(((ToolStripMenuItem)sender).Tag.ToString())) 96 { 97 case 1: Tem_Double = 0.1; break; 98 case 2: Tem_Double = 0.2; break; 99 case 3: Tem_Double = 0.3; break; 100 case 4: Tem_Double = 0.4; break; 101 case 5: Tem_Double = 0.5; break; 102 case 6: Tem_Double = 0.6; break; 103 case 7: Tem_Double = 0.7; break; 104 case 8: Tem_Double = 0.8; break; 105 case 9: Tem_Double = 0.9; break; 106 } 107 Frm.Opacity = Tem_Double; 108 break; 109 } 110 case "ToolAcquiescence": 111 { 112 Frm.BackColor = Color.Gainsboro; 113 Frm.Opacity = 0.6; 114 break; 115 } 116 case "ToolClose": 117 { 118 Close(); 119 break; 120 } 121 } 122 } 123 #endregion 124 125 private void ToolColor_Glass_Click(object sender, EventArgs e) 126 { 127 SetEstate(this, sender); 128 } 129 } 130 }
【来自:[LonelyShadow 博客] http://www.cnblogs.com/LonelyShadow】