C#窗体设计------鼠标穿透窗体

技巧解析:主要用到了两个系统API函数 SetWindowLong和GetWindowLong

  1 using System;
  2 using System.Collections.Generic;
  3 using System.ComponentModel;
  4 using System.Data;
  5 using System.Drawing;
  6 using System.Linq;
  7 using System.Text;
  8 using System.Windows.Forms;
  9 using System.Runtime.InteropServices;
 10
 11 namespace MouseThroughForm
 12 {
 13     public partial class Frm_Main : Form
 14     {
 15         public Frm_Main()
 16         {
 17             InitializeComponent();
 18         }
 19
 20         private const uint WS_EX_LAYERED = 0x80000;
 21         private const int WS_EX_TRANSPARENT = 0x20;
 22         private const int GWL_EXSTYLE = (-20);
 23         private string Var_genre = "";//记录当前操作的类型
 24
 25         #region 在窗口结构中为指定的窗口设置信息
 26         /// <summary>
 27         /// 在窗口结构中为指定的窗口设置信息
 28         /// </summary>
 29         /// <param name="hwnd">欲为其取得信息的窗口的句柄</param>
 30         /// <param name="nIndex">欲取回的信息</param>
 31         /// <param name="dwNewLong">由nIndex指定的窗口信息的新值</param>
 32         /// <returns></returns>
 33         [DllImport("user32", EntryPoint = "SetWindowLong")]
 34         private static extern uint SetWindowLong(IntPtr hwnd, int nIndex, uint dwNewLong);
 35         #endregion
 36
 37         #region 从指定窗口的结构中取得信息
 38         /// <summary>
 39         /// 从指定窗口的结构中取得信息
 40         /// </summary>
 41         /// <param name="hwnd">欲为其获取信息的窗口的句柄</param>
 42         /// <param name="nIndex">欲取回的信息</param>
 43         /// <returns></returns>
 44         [DllImport("user32", EntryPoint = "GetWindowLong")]
 45         private static extern uint GetWindowLong(IntPtr hwnd, int nIndex);
 46         #endregion
 47
 48         #region 使窗口有鼠标穿透功能
 49         /// <summary>
 50         /// 使窗口有鼠标穿透功能
 51         /// </summary>
 52         private void CanPenetrate()
 53         {
 54             uint intExTemp = GetWindowLong(this.Handle, GWL_EXSTYLE);
 55             uint oldGWLEx = SetWindowLong(this.Handle, GWL_EXSTYLE, WS_EX_TRANSPARENT | WS_EX_LAYERED);
 56         }
 57         #endregion
 58
 59         private void Frm_Main_Load(object sender, EventArgs e)
 60         {
 61             this.ShowInTaskbar = false;//窗体不出现在Windows任务栏中
 62             CanPenetrate();
 63             this.TopMost = true;//使窗体始终在其它窗体之上
 64         }
 65
 66         #region 设置颜色和透明度的状态
 67         /// <summary>
 68         /// 设置颜色和透明度的状态
 69         /// </summary>
 70         private void SetEstate(Form Frm, object sender)
 71         {
 72             Var_genre = ((ToolStripMenuItem)sender).Name;
 73             string Tem_Str = Var_genre;
 74             if (Var_genre.IndexOf(‘_‘) >= 0)
 75             {
 76                 Var_genre = Tem_Str.Substring(0, Tem_Str.IndexOf(‘_‘));
 77             }
 78
 79             switch (Var_genre)
 80             {
 81                 case "ToolColor":
 82                     {
 83                         Color Tem_Color=Color.Gainsboro;
 84                         switch (Convert.ToInt32(((ToolStripMenuItem)sender).Tag.ToString()))
 85                         {
 86                             case 1: Tem_Color = Color.Gainsboro; break;
 87                             case 2: Tem_Color = Color.DarkOrchid; break;
 88                             case 3: Tem_Color = Color.RoyalBlue; break;
 89                             case 4: Tem_Color = Color.Gold; break;
 90                             case 5: Tem_Color = Color.LightGreen; break;
 91                         }
 92                         Frm.BackColor = Tem_Color;
 93                         break;
 94                     }
 95                 case "ToolClarity":
 96                     {
 97                         double Tem_Double = 0.0;
 98                         switch (Convert.ToInt32(((ToolStripMenuItem)sender).Tag.ToString()))
 99                         {
100                             case 1: Tem_Double = 0.1; break;
101                             case 2: Tem_Double = 0.2; break;
102                             case 3: Tem_Double = 0.3; break;
103                             case 4: Tem_Double = 0.4; break;
104                             case 5: Tem_Double = 0.5; break;
105                             case 6: Tem_Double = 0.6; break;
106                             case 7: Tem_Double = 0.7; break;
107                             case 8: Tem_Double = 0.8; break;
108                             case 9: Tem_Double = 0.9; break;
109
110                         }
111                         Frm.Opacity = Tem_Double;
112                         break;
113                     }
114                 case "ToolAcquiescence":
115                     {
116                         Frm.BackColor = Color.Gainsboro;
117                         Frm.Opacity = 0.6;
118                         break;
119                     }
120                 case "ToolClose":
121                     {
122                         Close();
123                         break;
124                     }
125
126             }
127         }
128         #endregion
129
130         private void ToolColor_Glass_Click(object sender, EventArgs e)
131         {
132             SetEstate(this, sender);
133         }
134     }
135 }
时间: 2024-12-25 16:28:14

C#窗体设计------鼠标穿透窗体的相关文章

PYQT设计无边框窗体

#UI.py,通过UI设计师制作后直接转换为UI.py脚本 # -*- coding: utf-8 -*-from PyQt4 import QtCore, QtGui try:    _fromUtf8 = QtCore.QString.fromUtf8except AttributeError:    _fromUtf8 = lambda s: s class Ui_Form(object):    def setupUi(self, Form):        Form.setObject

游戏UI框架设计(四) : 模态窗体管理

游戏UI框架设计(四) --模态窗体管理 我们在开发UI窗体时,对于"弹出窗体"往往因为需要玩家优先处理弹出小窗体,则要求玩家不能(无法)点击"父窗体",这种窗体就是典型的"模态窗体".在此笔者设计了四种模式类型:完全透明.半透明.低透明度.透明且可以穿透. (透明不能穿透) (半透明不能穿透) (低透明度,不能穿透) 对于"模态窗体"的基本实现原理是: 在弹出窗体的后面增加一层"UI遮罩窗体",当需要弹出

VB6/VBA中跟踪鼠标移出窗体控件事件(类模块成员函数指针CHooker类应用)

前几天发了一篇博文,是关于获取VB类模块成员函数指针的内容(http://www.cnblogs.com/alexywt/p/5880993.html):今天我就发一下我的应用实例. VB中默认是没有鼠标移出事件响应的,而这个事件其实在项目开发中,实用性很强,很多时候需要在鼠标移出窗体或控件时做些事情:没有这个事件会感觉很费力: 今天我所说的实际案例就是,在窗体上,设计一个SplitterBar控件,窗体的最终用户使用这个控件可以在运行程序时任意调整其内部控件大小. 我在第二篇参考博文作者开发的

Extjs 窗体居中,双重窗体弹出时清除父窗体的鼠标事件

这个是监控窗体缩放的事件 缩放中居中主要在 'beforeshow' 和 'destroy'两个事件里面监控 var EditTempWindow; Ext.EventManager.onWindowResize(function() { if (EditTempWindow) { EditTempWindow.center() } }); Ext.define("Define.Class.EditWindow", { id: 'RoomEditWin', xtype: 'window

C# winform窗体设计-查询单个值

查询单个值主要用于对成绩最低分,最高分,学生总数,学生性别等信息的统计 在查询单个值的时候用到了ExecuteScalar方法,连接以及语句方面,以及思路和对数据的增删改差不多 下面请看一段代码: string s = "server=.;database=SampleDb;Integrated Security=True"; SqlConnection c = new SqlConnection(s); c.Open(); SqlCommand command = new SqlCo

磁性Form窗体设计

步骤: 创建一个名为magnetism的WinForms应用程序 再添加两个窗体分别命名为Form2和Form3 添加一个class命名为FrmClass,用于处理磁性窗体的一些操作 添加控件及代码 Form1.Designer.cs代码 namespace magnetism { partial class Form1 { /// <summary> /// Required designer variable. /// </summary> private System.Com

VB.net窗体设计

1 设定窗体大小: MaximizeBox:窗体最大化设置.  FormBorderStyle:设置窗体样式,如:使用鼠标调整窗体大小等. 1 2 3 4 5 6 '窗体最大化 Form.WindowState = FormWindowState.Maximized '禁用窗体最大化按钮 Form.MaximizeBox = False '禁止用户用鼠标改变窗体大小 Me.FormBorderStyle = Windows.Forms.FormBorderStyle.FixedSingle

C# winform窗体设计-通过条件查询数据

在winform 数据库设计中,有时候需要通过条件查询对应的数据,并且将数据显示在文本框(or 富文本框)中,下面,小编将讲述通过一个条件: 首先,我们需要对数据库建立连接,并且执行数据库命令,在此之前,我们先创建一个winform窗体,窗体设计大概如下所示:    在创建窗体后,我们应该进行书写代码阶段: 1 string s = "server=SAM_PC;database=MInformationDB;Integrated Security=true"; 2 SqlConnec

设计闪烁的窗体

1.概述 qq对话框接收到消息时,如果对话框不是活动窗体,对话框就会闪烁来提示用户有新消息需要阅读,本文就是要实现这种形式的闪烁窗体. 2.设计详情 .NET没有直接提供实现窗体闪烁的类和方法,需要调用Windows的API函数FlashWindow()实现.该函数在c#中的声明如下: [DllImport("user32")]     private static extern long FlashWindow(IntPtr handle,bool bInvert); 此函数可以实现