sharpdx / SharpDX-Samples

Official repository for all SharpDX Samples
346 stars 222 forks source link

RawInput invaild operation error when closing form #50

Open gomidas opened 6 years ago

gomidas commented 6 years ago

I get this error when I close app. what am I doing wrong ?

InputHandler.cs

using SharpDX.Multimedia;
using SharpDX.RawInput;
using System;
using System.Threading;
/*using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;*/
using System.Windows.Forms;

namespace CubeApp
{
    public class InputHandler
    {
        public bool KeyRight = false;
        public bool KeyLeft  = false;
        public bool KeyDown  = false;
        public bool KeyUp    = false;

        //COMMON WASD (FPShooter) KEYS
        public bool KeyW = false;
        public bool KeyA = false;
        public bool KeyS = false;
        public bool KeyD = false;

        //COMMON ROTATION KEYS (E,Q)
        public bool KeyE = false;
        public bool KeyQ = false;

        //MOUSE BUTTONS
        public bool MouseLeftButton = false;
        public bool MouseRightButton = false;
        public bool MouseMiddleButton = false;

        //CAMERA ROTATION
        public bool KeyR = false;
        public bool KeyT = false;
        public bool KeyY = false;
        public bool KeyU = false;

        public InputHandler(RenderForm_EX form)
        {
            form.inputHandler = this;

            // setup the device
            if (form.IsHandleCreated) {
            Device.RegisterDevice(UsagePage.Generic, UsageId.GenericMouse, DeviceFlags.None);
            Device.MouseInput += (sender, args) => form.Invoke(new UpdateTextCallback(UpdateMouseText), args);
            Device.RegisterDevice(UsagePage.Generic, UsageId.GenericKeyboard, DeviceFlags.None);
            Device.KeyboardInput += (sender, args) => form.Invoke(new UpdateTextCallback(UpdateKeyboardText), args);

            }
        }

        void UpdateKeyboardText(RawInputEventArgs rawArgs)
        {
            var args = (KeyboardInputEventArgs)rawArgs;

            if (args.Key == Keys.Right && args.State == KeyState.KeyDown ) { KeyRight =  true; Console.WriteLine(Keys.Right+"[Down]");     }
            if (args.Key == Keys.Right && args.State == KeyState.KeyUp   ) { KeyRight =  false; Console.WriteLine(Keys.Right + "[Up]"); }
            if (args.Key == Keys.Left && args.State  == KeyState.KeyDown ) { KeyLeft  =  true; Console.WriteLine(Keys.Right + "[Down]"); }
            if (args.Key == Keys.Left && args.State  == KeyState.KeyUp   ) { KeyLeft  =  false; Console.WriteLine(Keys.Right + "[Up]"); }
            if (args.Key == Keys.Down && args.State  == KeyState.KeyDown ) { KeyDown  =  true; Console.WriteLine(Keys.Right + "[Down]"); }
            if (args.Key == Keys.Down && args.State  == KeyState.KeyUp   ) { KeyDown  =  false; Console.WriteLine(Keys.Right + "[Up]"); }
            if (args.Key == Keys.Up && args.State    == KeyState.KeyDown ) { KeyUp    =  true; Console.WriteLine(Keys.Right + "[Down]"); }
            if (args.Key == Keys.Up && args.State    == KeyState.KeyUp   ) { KeyUp    =  false; Console.WriteLine(Keys.Right + "[Up]"); }

            //COMMON WASD KEYS
            if (args.Key == Keys.W && args.State == KeyState.KeyDown) { KeyW= true; Console.WriteLine(Keys.W + "[Down]"); }
            if (args.Key == Keys.W && args.State == KeyState.KeyUp) { KeyW = false; Console.WriteLine(Keys.W + "[Up]"); }
            if (args.Key == Keys.A && args.State == KeyState.KeyDown) { KeyA = true; Console.WriteLine(Keys.A + "[Down]"); }
            if (args.Key == Keys.A && args.State == KeyState.KeyUp) { KeyA = false; Console.WriteLine(Keys.A + "[Up]"); }
            if (args.Key == Keys.S && args.State == KeyState.KeyDown) { KeyS = true; Console.WriteLine(Keys.S + "[Down]"); }
            if (args.Key == Keys.S && args.State == KeyState.KeyUp) { KeyS = false; Console.WriteLine(Keys.S + "[Up]"); }
            if (args.Key == Keys.D && args.State == KeyState.KeyDown) { KeyD = true; Console.WriteLine(Keys.D + "[Down]"); }
            if (args.Key == Keys.D && args.State == KeyState.KeyUp) { KeyD = false; Console.WriteLine(Keys.D + "[Up]"); }

            //COMMON E,Q KEYS
            if (args.Key == Keys.E && args.State == KeyState.KeyDown) { KeyE = true; Console.WriteLine(Keys.E + "[Down]"); }
            if (args.Key == Keys.E && args.State == KeyState.KeyUp) { KeyE = false; Console.WriteLine(Keys.E + "[Up]"); }
            if (args.Key == Keys.Q && args.State == KeyState.KeyDown) { KeyQ = true; Console.WriteLine(Keys.Q + "[Down]"); }
            if (args.Key == Keys.Q && args.State == KeyState.KeyUp) { KeyQ = false; Console.WriteLine(Keys.Q + "[Up]"); }

            //ROTATE CAMERA R,T
            if (args.Key == Keys.R && args.State == KeyState.KeyDown) { KeyR = true; Console.WriteLine(Keys.R + "[Down]"); }
            if (args.Key == Keys.R && args.State == KeyState.KeyUp) { KeyR = false; Console.WriteLine(Keys.R + "[Up]"); }
            if (args.Key == Keys.T && args.State == KeyState.KeyDown) { KeyT = true; Console.WriteLine(Keys.T + "[Down]"); }
            if (args.Key == Keys.T && args.State == KeyState.KeyUp) { KeyT = false; Console.WriteLine(Keys.T + "[Up]"); }

            //ROTATE CAMERA Y,U
            if (args.Key == Keys.Y && args.State == KeyState.KeyDown) { KeyY = true; Console.WriteLine(Keys.Y + "[Down]"); }
            if (args.Key == Keys.Y && args.State == KeyState.KeyUp) { KeyY = false; Console.WriteLine(Keys.Y + "[Up]"); }
            if (args.Key == Keys.U && args.State == KeyState.KeyDown) { KeyU = true; Console.WriteLine(Keys.U + "[Down]"); }
            if (args.Key == Keys.U && args.State == KeyState.KeyUp) { KeyU = false; Console.WriteLine(Keys.U + "[Up]"); }
        }
        /// <summary>
        /// Updates the mouse text.
        /// </summary>
        /// <param name="rawArgs">The <see cref="SharpDX.RawInput.RawInputEventArgs"/> instance containing the event data.</param>
        void UpdateMouseText(RawInputEventArgs rawArgs)
        {
            var args = (MouseInputEventArgs)rawArgs;
            //LEFT BUTTON
            if (args.ButtonFlags == MouseButtonFlags.Button1Down) { MouseLeftButton = true; Console.WriteLine(MouseButtons.Left + "[Down]"); }
            if (args.ButtonFlags == MouseButtonFlags.Button1Up) { MouseLeftButton = false; Console.WriteLine(MouseButtons.Left + "[Up]"); }
            //RIGHT BUTTON
            if (args.ButtonFlags == MouseButtonFlags.Button2Down) { MouseRightButton = true; Console.WriteLine(MouseButtons.Right + "[Down]"); }
            if (args.ButtonFlags == MouseButtonFlags.Button2Up) { MouseRightButton = false; Console.WriteLine(MouseButtons.Right + "[Up]"); }
            //MIDDLE BUTTON
            if (args.ButtonFlags == MouseButtonFlags.Button3Down) { MouseRightButton = true; Console.WriteLine(MouseButtons.Middle + "[Down]"); }
            if (args.ButtonFlags == MouseButtonFlags.Button3Up) { MouseRightButton = false; Console.WriteLine(MouseButtons.Middle + "[Up]"); }
        }
        /// <summary>
        /// Delegate use for printing events
        /// </summary>
        /// <param name="args">The <see cref="SharpDX.RawInput.RawInputEventArgs"/> instance containing the event data.</param>
        public delegate void UpdateTextCallback(RawInputEventArgs args);
    }
}

I call it like : InputHandler IHandler = new InputHandler(form);

System.InvalidOperationException oluştu
  HResult=0x80131509
  İleti=Pencere işleyicisi oluşturuluncaya kadar denetim üzerinde Invoke veya BeginInvoke çağrılamaz.
  Kaynak=System.Windows.Forms
  StackTrace:
   konum System.Windows.Forms.Control.MarshaledInvoke(Control caller, Delegate method, Object[] args, Boolean synchronous)
   konum System.Windows.Forms.Control.Invoke(Delegate method, Object[] args)
   konum CubeApp.InputHandler.<>c__DisplayClass17_0.<.ctor>b__0(Object sender, MouseInputEventArgs args) C:\Users\gomid_000\Documents\Visual Studio 2017\Projects\CubeApp\CubeApp\InputHandler.cs içinde: 50. satır
   konum SharpDX.RawInput.Device.HandleMessage(IntPtr rawInputMessagePointer, IntPtr hwnd)
   konum SharpDX.RawInput.Device.RawInputMessageFilter.PreFilterMessage(Message& m)
   konum System.Windows.Forms.Application.ThreadContext.ProcessFilters(MSG& msg, Boolean& modified)
   konum System.Windows.Forms.Application.FilterMessage(Message& message)
   konum SharpDX.Windows.RenderLoop.NextFrame()
   konum SharpDX.Windows.RenderLoop.Run(Control form, RenderCallback renderCallback, Boolean useApplicationDoEvents)
   konum CubeApp.Program.<>c__DisplayClass4_0.<Main>b__4() C:\Users\gomid_000\Documents\Visual Studio 2017\Projects\CubeApp\CubeApp\Program.cs içinde: 310. satır
   konum System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   konum System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   konum System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   konum System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   konum System.Threading.ThreadHelper.ThreadStart()