马上加入IBC程序猿 各种源码随意下,各种教程随便看! 注册 每日签到 加入编程讨论群

C#教程 ASP.NET教程 C#视频教程程序源码享受不尽 C#技术求助 ASP.NET技术求助

【源码下载】 社群合作 申请版主 程序开发 【远程协助】 每天乐一乐 每日签到 【承接外包项目】 面试-葵花宝典下载

官方一群:

官方二群:

Winform鼠标穿透窗体C#

[复制链接]
查看5009 | 回复0 | 2014-4-16 10:15:24 | 显示全部楼层 |阅读模式
【实例说明】
 用户在对桌面进行操作时,为了使桌面更加美观,可以在桌面的上面加一层类似于玻璃的效果,用户可以用鼠标透过“玻璃”对桌面进行操作。
 本实例通过使用鼠标穿透窗体来实现以上功能。


【关键技术】
 本实例实现时主要用到了API函数SetWindowLong和GetWindowLong,下面分别对他们进行详细的讲解。
 (1)SetWindowLong函数:该函数主要用于在窗口结构中为指定的窗口设置信息。语法格式如下:
[C#] 纯文本查看 复制代码
 [DllImport("user32", EntryPoint = "SetWindowLong")]
 private static extern uint SetWindowLong(IntPtr hwnd, int nIndex, uint dwNewLong);

(2)GetWindowLong函数:该函数主要从指定窗口的结构中取得信息。语法格式如下:
[C#] 纯文本查看 复制代码
 [DllImport("user32", EntryPoint = "GetWindowLong")]
 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来实现鼠标的穿透效果。


窗体实现代码如下:

[C#] 纯文本查看 复制代码
using System;
using System.Collections.Generic; 
using System.Drawing;
using System.Linq; 
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace MouseThroughForm
{
     public partial class Frm_Main : Form
     {
          public Frm_Main()
          {
               InitializeComponent();
          }

          private const uint WS_EX_LAYERED = 0x80000;
          private const int WS_EX_TRANSPARENT = 0x20;
          private const int GWL_EXSTYLE = (-20);
          private string Var_genre = "";//记录当前操作的类型

          #region 在窗口结构中为指定的窗口设置信息
          /// <summary>
          /// 在窗口结构中为指定的窗口设置信息
          /// </summary>
          /// <param name="hwnd">欲为其取得信息的窗口的句柄</param>
          /// <param name="nIndex">欲取回的信息</param>
          /// <param name="dwNewLong">由nIndex指定的窗口信息的新值</param>
          /// <returns></returns>
          [DllImport("user32", EntryPoint = "SetWindowLong")]
          private static extern uint SetWindowLong(IntPtr hwnd, int nIndex, uint dwNewLong);
          #endregion

          #region 从指定窗口的结构中取得信息
          /// <summary>
          /// 从指定窗口的结构中取得信息
          /// </summary>
          /// <param name="hwnd">欲为其获取信息的窗口的句柄</param>
          /// <param name="nIndex">欲取回的信息</param>
          /// <returns></returns>
          [DllImport("user32", EntryPoint = "GetWindowLong")]
          private static extern uint GetWindowLong(IntPtr hwnd, int nIndex);
          #endregion

          #region 使窗口有鼠标穿透功能
          /// <summary>
          /// 使窗口有鼠标穿透功能
          /// </summary>
          private void CanPenetrate()
          {
               uint intExTemp = GetWindowLong(this.Handle, GWL_EXSTYLE);
               uint oldGWLEx = SetWindowLong(this.Handle, GWL_EXSTYLE, WS_EX_TRANSPARENT | WS_EX_LAYERED);
          }
          #endregion

          private void Frm_Main_Load(object sender, EventArgs e)
          {
               this.ShowInTaskbar = false;//窗体不出现在Windows任务栏中
               CanPenetrate();
               this.TopMost = true;//使窗体始终在其它窗体之上
          }

          #region 设置颜色和透明度的状态
          /// <summary>
          /// 设置颜色和透明度的状态
          /// </summary>
          private void SetEstate(Form Frm, object sender)
          {
               Var_genre = ((ToolStripMenuItem)sender).Name;
               string Tem_Str = Var_genre;
               if (Var_genre.IndexOf('_') >= 0)
               {
                    Var_genre = Tem_Str.Substring(0, Tem_Str.IndexOf('_'));
               }

               switch (Var_genre)
               {
                    case "ToolColor":
                        {
                             Color Tem_Color=Color.Gainsboro;
                             switch (Convert.ToInt32(((ToolStripMenuItem)sender).Tag.ToString()))
                             {
                                  case 1: Tem_Color = Color.Gainsboro; break;
                                  case 2: Tem_Color = Color.DarkOrchid; break;
                                  case 3: Tem_Color = Color.RoyalBlue; break;
                                  case 4: Tem_Color = Color.Gold; break;
                                  case 5: Tem_Color = Color.LightGreen; break;
                             }
                             Frm.BackColor = Tem_Color;
                             break;
                        }
                    case "ToolClarity":
                        {
                             double Tem_Double = 0.0;
                             switch (Convert.ToInt32(((ToolStripMenuItem)sender).Tag.ToString()))
                             {
                                  case 1: Tem_Double = 0.1; break;
                                  case 2: Tem_Double = 0.2; break;
                                  case 3: Tem_Double = 0.3; break;
                                  case 4: Tem_Double = 0.4; break;
                                  case 5: Tem_Double = 0.5; break;
                                  case 6: Tem_Double = 0.6; break;
                                  case 7: Tem_Double = 0.7; break;
                                  case 8: Tem_Double = 0.8; break;
                                  case 9: Tem_Double = 0.9; break;
                             }
                             Frm.Opacity = Tem_Double;
                             break;
                        }
                    case "ToolAcquiescence":
                        {
                             Frm.BackColor = Color.Gainsboro;
                             Frm.Opacity = 0.6;
                             break;
                        }
                    case "ToolClose":
                        {
                             Close();
                             break;
                       }
              }
         }
         #endregion

          private void ToolColor_Glass_Click(object sender, EventArgs e)
          {
               SetEstate(this, sender);
          }
     }
}







C#论坛 www.ibcibc.com IBC编程社区
C#
C#论坛
IBC编程社区
*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则