示例#1
0
        /// <summary>
        /// Simple non-OLE drag operation.
        /// Returns true if dropped, false if cancelled.
        /// </summary>
        /// <param name="window">Window or control that owns the drag operation.</param>
        /// <param name="mouseButton">Mouse button that is used for the drag operation: Left, Right.</param>
        /// <param name="onMouseKeyMessage">Callback function, called on each received mouse/key message. Optional.</param>
        public static bool SimpleDragDrop(AnyWnd window, MButtons mouseButton = MButtons.Left, Action <MsgArgs> onMouseKeyMessage = null)
        {
            AWnd w = window.Wnd;

            Api.SetCapture(w);

            bool R = false;
            var  x = new MsgArgs();

            for (; ;)
            {
                if (Api.GetCapture() != w)
                {
                    return(false);
                }
                if (Api.GetMessage(out x.Msg) <= 0)
                {
                    if (x.Msg.message == Api.WM_QUIT)
                    {
                        Api.PostQuitMessage((int)x.Msg.wParam);
                    }
                    break;
                }

                bool call = false;
                int  m    = x.Msg.message;
                if (m >= Api.WM_MOUSEFIRST && m <= Api.WM_MOUSELAST)
                {
                    if (m == Api.WM_LBUTTONUP)
                    {
                        if (R = (mouseButton & MButtons.Left) != 0)
                        {
                            break;
                        }
                    }
                    else if (m == Api.WM_RBUTTONUP)
                    {
                        if (R = (mouseButton & MButtons.Right) != 0)
                        {
                            break;
                        }
                    }
                    call = true;
                }
                else if (m == Api.WM_KEYDOWN || m == Api.WM_KEYUP || m == Api.WM_SYSKEYDOWN || m == Api.WM_SYSKEYUP)
                {
                    //on key down/up caller may want to update cursor when eg Ctrl pressed/released
                    if (x.Msg.wParam == (byte)KKey.Escape)
                    {
                        break;
                    }
                    call = true;
                }

                if (call && onMouseKeyMessage != null)
                {
                    onMouseKeyMessage(x);
                    if (x._stopped)
                    {
                        break;
                    }
                    if (x.Cursor != null)
                    {
                        Api.SetCursor(x.Cursor.Handle);
                        x.Cursor = null;
                    }
                }

                Api.DispatchMessage(x.Msg);
            }

            Api.ReleaseCapture();
            return(R);
        }
示例#2
0
文件: keys_static.cs 项目: qmgindi/Au
        /// <summary>
        /// Waits while some modifier keys (Ctrl, Shift, Alt, Win) or mouse buttons are pressed.
        /// </summary>
        /// <param name="secondsTimeout">Timeout, seconds. Can be 0 (infinite), &gt;0 (exception) or &lt;0 (no exception). More info: [](xref:wait_timeout).</param>
        /// <param name="mod">Check only these keys. Default: all.</param>
        /// <param name="buttons">Check only these buttons. Default: all.</param>
        /// <returns>Returns true. On timeout returns false if <i>secondsTimeout</i> is negative; else exception.</returns>
        /// <exception cref="TimeoutException"><i>secondsTimeout</i> time has expired (if &gt; 0).</exception>
        /// <seealso cref="isMod"/>
        /// <seealso cref="mouse.isPressed"/>
        /// <seealso cref="mouse.waitForNoButtonsPressed"/>
        public static bool waitForNoModifierKeysAndMouseButtons(double secondsTimeout = 0.0, KMod mod = KMod.Ctrl | KMod.Shift | KMod.Alt | KMod.Win, MButtons buttons = MButtons.Left | MButtons.Right | MButtons.Middle | MButtons.X1 | MButtons.X2)
        {
            var to = new wait.Loop(secondsTimeout, new OWait(period: 2));

            for (; ;)
            {
                if (!isMod(mod) && !mouse.isPressed(buttons))
                {
                    return(true);
                }
                if (!to.Sleep())
                {
                    return(false);
                }
            }
        }