/// <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); }
/// <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), >0 (exception) or <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 > 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); } } }