Windows API 移动 Window

本文介绍了如何利用WindowsAPI中的ReleaseCapture和SendMessage函数,配合C#实现在自定义窗体中通过鼠标点击标题栏实现移动功能。详细讲解了这两个API的作用和在C#代码中的应用。
摘要由CSDN通过智能技术生成

本文转载自 : Windows API实现移动窗体 - SauronKing - 博客园 (cnblogs.com)

在我们自定义窗体的时候,实现鼠标点击拖动标题栏移动窗体是必要的,而用Windows API来实现这一功能相对来说最简单,需要用到的API函数有两个:

1:BOOL WINAPI ReleaseCapture(void);

2:LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam)

第二个方法是向窗体发送移动的命令,主要解释一下第一个方法。

ReleaseCapture官方的解释是释放窗体的鼠标捕获,并且恢复鼠标接收指令,这一步是为了接下来根据鼠标来移动窗体做准备,关键的是下一步,ReleaseCapture让窗体捕获所有的鼠标输入(无论鼠标在哪里),只有这样我们移动鼠标的时候窗体才会跟着一直移动,直到再次对鼠标进行操作。

最后,已C#语言为例,实现窗体移动:

    //****************************************************
    //创建人:xxx
    //创建时间:2016-09-23
    //功能说明:该类是一个重新绘制的窗体
    //****************************************************
    public partial class MyForm : Form
    {
        /// <summary>
        /// 释放鼠标捕获
         /// </summary>
        /// <returns>成功返回true,失败返回false</returns>
        [DllImport("user32.dll")]
        public static extern Boolean ReleaseCapture();

        /// <summary>
        /// 向窗体发送消息
         /// </summary>
        /// <param name="hwnd">窗体的句柄</param>
        /// <param name="wMsg">消息号</param>
        /// <param name="wParam">消息的附加信息</param>
        /// <param name="lParam">消息的附加信息</param>
        /// <returns>成功返回true,失败返回false</returns>
        [DllImport("user32.dll")]
        public static extern Boolean SendMessage(IntPtr hwnd, Int32 wMsg, Int32 wParam, Int32 lParam);

        public const Int32 WM_SYSCOMMAND = 0x0112;

        public const Int32 SC_MOVE = 0xF010;

        public const Int32 HTCAPTION = 0x0002;

        /// <summary>
        /// 窗体的鼠标点击事件委托
         /// </summary>
        private void panelTitle_MouseDown(object sender, MouseEventArgs e)
        {
            ReleaseCapture();
            SendMessage(this.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);
        }
}

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值