C#WinForm无边框窗体移动方法、模仿鼠标单击标题栏移动窗体位置

C#WinForm无边框窗体移动方法、模仿鼠标单击标题栏移动窗体位置

这里介绍俩种办法

方法一:直接通过修改窗体位置从而达到移动窗体的效果

方法二:直接伪装发送单击任务栏消息,让应用程序误以为单击任务栏从而移动窗体

新建窗体用于测试

方法一

1.定义一个位置信息Point用于存储鼠标位置

1         private Point mPoint;

2.给窗体等控件增加MouseDown和MouseMove事件

 1         /// <summary>
 2         /// 鼠标按下
 3         /// </summary>
 4         /// <param name="sender"></param>
 5         /// <param name="e"></param>
 6         private void panel1_MouseDown(object sender, MouseEventArgs e)
 7         {
 8             mPoint = new Point(e.X, e.Y);
 9         }
10
11         /// <summary>
12         /// 鼠标移动
13         /// </summary>
14         /// <param name="sender"></param>
15         /// <param name="e"></param>
16         private void panel1_MouseMove(object sender, MouseEventArgs e)
17         {
18             if (e.Button == MouseButtons.Left)
19             {
20                 this.Location = new Point(this.Location.X + e.X - mPoint.X, this.Location.Y + e.Y - mPoint.Y);
21             }
22         }

方法二:

1.引入下面代码 前提需要引入命名空间using System.Runtime.InteropServices

1         [DllImport("user32.dll")]
2         public static extern bool ReleaseCapture();
3
4         [DllImport("user32.dll")]
5         public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
6
7         private const int VM_NCLBUTTONDOWN = 0XA1;//定义鼠标左键按下
8         private const int HTCAPTION = 2;

2.增加鼠标按下事件发送消息,让系统误以为按下是标题栏

 1         /// <summary>
 2         /// 鼠标按下
 3         /// </summary>
 4         /// <param name="sender"></param>
 5         /// <param name="e"></param>
 6         private void panel1_MouseDown(object sender, MouseEventArgs e)
 7         {
 8             //为当前应用程序释放鼠标捕获
 9             ReleaseCapture();
10             //发送消息 让系统误以为在标题栏上按下鼠标
11             SendMessage((IntPtr)this.Handle, VM_NCLBUTTONDOWN, HTCAPTION, 0);
12         }

测试效果

源代码工程文件下载

原文地址:https://www.cnblogs.com/JiYF/p/9053596.html

时间: 2024-08-01 23:20:20

C#WinForm无边框窗体移动方法、模仿鼠标单击标题栏移动窗体位置的相关文章

C#WinForm无边框窗体移动----模仿鼠标单击标题栏移动窗体位置

C#WinForm无边框窗体移动方法.模仿鼠标单击标题栏移动窗体位置 这里介绍俩种办法 方法一:直接通过修改窗体位置从而达到移动窗体的效果 方法二:直接伪装发送单击任务栏消息,让应用程序误以为单击任务栏从而移动窗体 新建窗体用于测试 方法一 1.定义一个位置信息Point用于存储鼠标位置 1 private Point mPoint; 2.给窗体等控件增加MouseDown和MouseMove事件 1 /// <summary> 2 /// 鼠标按下 3 /// </summary>

winform 无边框窗体

一.无边框窗体1.控制按钮如何制作就是放置可以点击的控件,不局限于使用按钮或是什么别的,只要可以点击能触发点击事件就可以了 做的好看一点,就是鼠标移入,移出,按下三个事件会让按钮改变样式Mouseenter鼠标进入Mouseleave鼠标移出Mousedown鼠标按下 改变样式代码: pictureBox1.BackgroundImage = Image.FromFile(Application.StartupPath + "\\..\\..\\images\\btn_close_disable

WinForm 无边框窗体和timer控件

一.无边框窗体 1.控制按钮如何制作就是放置可以点击的控件,不局限于使用按钮或是什么别的,只要可以点击能触发点击事件就可以了 做的好看一点,就是鼠标移入,移出,按下三个事件会让按钮改变样式 如何获取图片的相对路径Application.StartupPath + "\\..\\..\\images\\btn_close_highlight.png" \..\文件夹名称... 向上翻一个文件夹 2.如何让窗体动起来调用窗体移动的API 如果有其它控件覆盖了窗体,那么写好鼠标按下的事件委托

WinForm 无边框窗体改变尺寸及移动窗体

#region 无边框窗体移动改变大小 [DllImport("user32.dll")] public static extern bool ReleaseCapture(); [DllImport("user32.dll")] public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam); public const int WM_SYSCOMMAND =

解决 GTK+/GNOME 3 环境下 Java Swing 程序使用本地 GTK+ 主题时菜单无边框 bug 的方法

在 GTK+/GNOME 3 环境下采用默认的 Adwaita 主题时,Java Swing 程序如果使用本地 GTK+ 主题会出现菜单无边框的 bug,这个问题也可能在其他常用的 GTK+ 主题中出现.说这是 Java Swing 的 bug 还是 GTK+/GNOME 3 的主题(如 Adwaita)的 bug 其实意义不是太大.这里给出一个简单的解决办法,其思路是修改 GTK+/GNOME 3 的主题,这里以系统默认的 Adwaita 主题为例: Adwaita 主题文件位于 /usr/s

Qt 无边框、透明、可移动、的个性窗体案例详解

很多朋友都问透明的效果怎么做,为什么自己做的无边框窗体不可移动,一个个回答的很累,干脆写出来分享下好了. int main(int argc, char *argv[]){ QApplication::setStyle("cleanlooks"); QApplication a(argc, argv); login w; w.setWindowTitle("ClientLogin"); w.setWindowOpacity(1); w.setWindowFlags(

Winform 无边框窗口移动自定义边框粗细颜色

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.Threading.Tasks; 9 using System.Windows.Forms; 10 11 namespace Wi

winform无边框窗口拖动

无边框的窗口想拖动,只需要在置顶的容器上添加对应的mousedown 和 mousemove 事件就可以实现了.代码如下: 1 //拖动窗口 2 private Point mPoint = new Point(); 3 4 private void panel1_MouseDown(object sender, MouseEventArgs e) 5 { 6 mPoint.X = e.X; 7 mPoint.Y = e.Y; 8 } 9 10 private void panel1_Mouse

WINFORM 无边框窗体 阴影与移动

//窗体移动API[DllImport("user32.dll")]public static extern bool ReleaseCapture();[DllImport("user32.dll")]public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int IParam);public const int WM_SYSCOMMAND = 0x0112;public c