非当前窗口时,winform无标题栏拖动

「已注销」 2018-05-08 10:26:31
winform无标题栏拖动已经实现,不过突然发现一个现象。

普通windows窗口,如果其处于非当前窗口时,直接单击标题栏能够将其变为当前窗口并同时实现拖动。

当winform窗口设置为无标题栏,并用程序实现点击某个控件进行拖动时,若其为当前窗口,可以正常单击拖动。若其为非当前窗口,直接点击拖动时只能将窗口变为当前窗口,需要再次点击控制才能实现拖动。

请问有没有什么方法可以直接像普通windows窗口一样,在非当前窗口下,点击一次实现变为当前窗口且能拖动。

程序实现拖动方法如下:

[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 = 0x0112;
public const int SC_MOVE = 0xF010;
public const int HTCAPTION = 0x0002;

public static void MoveForm(Form form, Control control)
{
ReleaseCapture();
SendMessage(form.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);
}
...全文
559 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2018-05-22
  • 打赏
  • 举报
回复
引用 7 楼 TERMINATOR_LZQ 的回复:
在页面加一个panel,然后使用触发它的MouseDown事件,调用方法就可以

        #region 拖动无窗体事件
        //定义无边框窗体Form         
        [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 = 0x0112;
        public const int SC_MOVE = 0xF010;
        public const int HTCAPTION = 0x0002;
        private void PanelFrmDrag_MouseDown(object sender, MouseEventArgs e)
        {
            ReleaseCapture();
            //调用移动无窗体控件函数 
            SendMessage(this.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);
        }
        #endregion
这是点击非标题栏时移动窗体的方法。 这个方法有个缺点,就是当窗体为非当前窗体时,需要点两次才能实现移动,第一次是将其变为当前窗体,第二次实现移动。 我这个帖子问的就是如何解决这个缺点,现已解决,不过还是谢谢你
CalvinR 2018-05-22
  • 打赏
  • 举报
回复
在页面加一个panel,然后使用触发它的MouseDown事件,调用方法就可以

        #region 拖动无窗体事件
        //定义无边框窗体Form         
        [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 = 0x0112;
        public const int SC_MOVE = 0xF010;
        public const int HTCAPTION = 0x0002;
        private void PanelFrmDrag_MouseDown(object sender, MouseEventArgs e)
        {
            ReleaseCapture();
            //调用移动无窗体控件函数 
            SendMessage(this.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);
        }
        #endregion
CalvinR 2018-05-22
  • 打赏
  • 举报
回复
之前有试过一个方法 大致方法就是加一个panel容器,遮住整个winform界面 然后后台写代码
「已注销」 2018-05-22
  • 打赏
  • 举报
回复
引用 3 楼 yanghao1 的回复:
要拖动的窗体要首先获得焦点。
谢谢,按你的提示,我在MouseEnter事件中添加了使其在失去焦点时重新得到焦点的函数,最终的效果达到了预期,不过不清楚这样做是不是会有什么问题出现。
「已注销」 2018-05-22
  • 打赏
  • 举报
回复
引用 2 楼 xuzuning 的回复:
先发一个 WA_CLICKACTIVE 消息 再发移动消息
尝试了,依旧是同样的问题
yanghao1 2018-05-10
  • 打赏
  • 举报
回复
要拖动的窗体要首先获得焦点。
xuzuning 2018-05-08
  • 打赏
  • 举报
回复
先发一个 WA_CLICKACTIVE 消息 再发移动消息
liwen9016 2018-05-08
  • 打赏
  • 举报
回复
试试能不能 响应3个事件,一个是被按下,一个是拖动,一个被放开,被按下把它选中为当前窗口,按下并拖动时拖动,放开后 还原按下前的当前窗口 为 当前窗口。

110,567

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧