模拟窗体附顶停靠隐藏

using System.Runtime.InteropServices;
/*
        Winform的 FormBorderStyle=None;
 */
namespace Windows_API_实现屏幕右下角_消息框_
{
    public partial class QQHide : Form
    {
        #region WinAPI http://msdn.microsoft.com/en-us/library/ms632669%28VS.85%29.aspx
        /// <summary>
        /// Enables you to produce special effects when showing or hiding windows. There are four types of animation: roll, slide, collapse or expand, and alpha-blended fade.
        /// </summary>
        /// <param name="handle">A handle to the window to animate. The calling thread must own this window.</param>
        /// <param name="time">The time it takes to play the animation, in milliseconds. Typically, an animation takes 200 milliseconds to play. </param>
        /// <param name="type">The type of animation. This parameter can be one or more of the following values. Note that, by default, these flags take effect when showing a window. To take effect when hiding a window, use AW_HIDE and a logical OR operator with the appropriate flags. </param>
        /// <returns>If the function succeeds, the return value is nonzero.</returns>
        [DllImport("user32.dll", CharSet = CharSet.Auto, EntryPoint = "AnimateWindow")]
        private static extern bool AnimateWindow(IntPtr handle, int time, AnimationType type);
        [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;  
        #endregion
        #region 获取全局鼠标位置  http://msdn.microsoft.com/en-us/library/ms648390(VS.85).aspx
        /// <summary>
        /// Retrieves the position of the mouse cursor, in screen coordinates.
        /// </summary>
        /// <param name="p">A pointer to a POINT structure that receives the screen coordinates of the cursor.</param>
        /// <returns>Returns nonzero if successful or zero otherwise. To get extended error information, call GetLastError.</returns>
        [DllImport("user32.dll")]
        private static extern bool GetCursorPos(ref Point p);        
        #endregion
       
        public QQHide()
        {
            InitializeComponent();
        }

        private void QQHide_Load(object sender, EventArgs e)
        {
            MessageBox.Show("模拟窗体附顶停靠隐藏");
        }
        int Y;
        int SimulateY;
        private void QQHide_LocationChanged(object sender, EventArgs e)
        {
            Y = this.Location.Y;
            this.lblX.Text = this.Location.X.ToString();
            this.lblY.Text = this.Location.Y.ToString();


            label1.Text = "X:" + MousePosition.X + "Y:" + MousePosition.Y;
            label2.Text = "X:" + (MousePosition.X - this.Location.X) + "Y:" + SimulateY;
        }
        /// <summary>
        /// 窗体原来位置
        /// </summary>
        Point SourcePoint;
        /// <summary>
        /// 窗体非激活状态
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void QQHide_Deactivate(object sender, EventArgs e)
        {
            if (HideConditionOfOne)
            {///满足条件隐藏窗体
                AnimateWindow(this.Handle, 150, AnimationType.AW_HIDE | AnimationType.AW_VER_NEGATIVE | AnimationType.AW_SLIDE);
                SourcePoint = this.Location;
                HideConditionOfOne = false;
            }
        }

        /// <summary>
        /// 隐藏条件之一:窗体上边缘贴近屏幕上边缘
        /// </summary>
        bool HideConditionOfOne;
        new bool IsEnter;

        private void QQHide_MouseEnter(object sender, EventArgs e)
        {
            IsEnter = true;
        }
        /// <summary>
        /// 鼠标离开窗体时更改条件变量值
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void QQHide_MouseLeave(object sender, EventArgs e)
        {
            if (IsEnter && Y < 3)
            {
                Point p = new Point(this.Location.X, 0);
                this.PointToScreen(p);
                this.Location = p;
                ///保存窗体位置并满足隐藏条件
                HideConditionOfOne = true;
            }
            IsEnter = false;
        }
        /// <summary>
        /// 鼠标按下时模拟窗体顶部边框拖拉窗体
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void QQHide_MouseDown(object sender, MouseEventArgs e)
        {
            SimulateY = (MousePosition.Y - this.Location.Y);
            ///模拟窗体拖拉框 
            if (SimulateY > 30)
                return;
            ReleaseCapture();
            SendMessage(this.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);
        }
        /// <summary>
        /// 实时更新鼠标位置
        /// </summary>
        Point MousePoint = new Point();
        private void tMonitor_Tick(object sender, EventArgs e)
        {
            GetCursorPos(ref MousePoint);
            ///Y方向符合显示窗体
            if (MousePoint.Y > 3)
                return;
            ///X方向符合显示窗体
            if (MousePoint.X > SourcePoint.X && MousePoint.X < (this.Width + SourcePoint.X))
                AnimateWindow(this.Handle, 100, AnimationType.AW_ACTIVATE | AnimationType.AW_SLIDE | AnimationType.AW_VER_POSITIVE);
            /*
            if (MousePosition.Y > 3)
                return;

            if (MousePosition.X > SourcePoint.X && MousePosition.X < (this.Width + SourcePoint.X))
                AnimateWindow(this.Handle, 100, AnimationType.AW_ACTIVATE | AnimationType.AW_SLIDE | AnimationType.AW_VER_POSITIVE);
            */
        }

    }

}
原文地址:https://www.cnblogs.com/wjshan0808/p/4217727.html