Beispiel #1
0
        /// <summary>
        /// 現在の入力モードを取得します。
        /// </summary>
        /// <returns>現在の入力モード。</returns>
        public static InputMode GetInputMode()
        {
            var guiThreadInfo = new GUITHREADINFO();

            guiThreadInfo.cbSize = Marshal.SizeOf <GUITHREADINFO>();
            PInvokeFunctions.GetGUIThreadInfo(0, ref guiThreadInfo);
            var imeWnd = PInvokeFunctions.ImmGetDefaultIMEWnd(guiThreadInfo.hwndFocus);

            var value1 = PInvokeFunctions.SendMessage(imeWnd, 0x0283, 0x0001, 0);
            var value2 = PInvokeFunctions.SendMessage(imeWnd, 0x0283, 0x0005, 0);

            if (value1 == 0)
            {
                return(InputMode.Disabled);
            }
            if (value2 == 1)
            {
                return(InputMode.Japanese);
            }
            if (value2 == 0)
            {
                return(InputMode.Direct);
            }
            return(InputMode.Unknown);
        }
        private void OnLoaded(object sender, RoutedEventArgs e)
        {
            var windowHandle = new WindowInteropHelper(AssociatedObject).Handle;
            var style        = PInvokeFunctions.GetWindowLong(windowHandle, WindowLongOffset.EXSTYLE);

            style |= 134217728u;
            PInvokeFunctions.SetWindowLong(windowHandle, WindowLongOffset.EXSTYLE, style);

            //  変更を適用させる。
            var flags = WindowPosFlags.NOMOVE | WindowPosFlags.NOSIZE | WindowPosFlags.NOZORDER | WindowPosFlags.FRAMECHANGED;

            PInvokeFunctions.SetWindowPos(windowHandle, IntPtr.Zero, 0, 0, 0, 0, flags);
        }
Beispiel #3
0
        /// <summary>
        /// 同時押しのキー入力を行います。
        /// 複数のキーの同時ストロークをシミュレートすることで入力します。
        /// </summary>
        /// <param name="virtualKeyCode">仮想キーコード。</param>
        public static void InputKey(IReadOnlyList <VirtualKeyCode> virtualKeyCodes)
        {
            var length = virtualKeyCodes.Count;
            var inputs = new INPUT[length * 2];

            for (int i = 0; i < length; i++)
            {
                var structures = ToInputStructure(virtualKeyCodes[i]);
                inputs[i]          = structures[0];
                inputs[i + length] = structures[1];
            }

            PInvokeFunctions.SendInput(length * 2, inputs, SizeOfInputStructure);
        }
Beispiel #4
0
        //  INPUT構造体の配列を作る。
        private static INPUT[] ToInputStructure(VirtualKeyCode virtualKeyCode)
        {
            var inputs = new INPUT[2];

            inputs[0]          = new INPUT();
            inputs[0].type     = InputType.INPUT_KEYBOARD;
            inputs[0].ki.wVk   = (ushort)virtualKeyCode;
            inputs[0].ki.wScan = (ushort)PInvokeFunctions.MapVirtualKey((uint)virtualKeyCode, 0);
            //inputs[0].ki.dwFlags = KeyboardInputFlag.KEYEVENTF_SCANCODE;

            inputs[1]             = inputs[0];
            inputs[1].ki.dwFlags |= KeyboardInputFlag.KEYEVENTF_KEYUP;

            return(inputs);
        }
Beispiel #5
0
        /// <summary>
        /// 文字列を直接入力します。
        /// 現在のIMEの入力モードに依存せず、また、日本語も直接入力で入力します。
        /// </summary>
        /// <param name="str">入力する文字列。</param>
        public static void InputDirectly(string str)
        {
            var length = str.Length;
            var inputs = new INPUT[length * 2];

            for (int i = 0; i < length; i++)
            {
                var j = i * 2;
                var k = j + 1;

                inputs[j]            = new INPUT();
                inputs[j].type       = InputType.INPUT_KEYBOARD;
                inputs[j].ki.wScan   = str[i];
                inputs[j].ki.dwFlags = KeyboardInputFlag.KEYEVENTF_UNICODE;

                inputs[k]             = inputs[j];
                inputs[k].ki.dwFlags |= KeyboardInputFlag.KEYEVENTF_KEYUP;
            }

            PInvokeFunctions.SendInput(length * 2, inputs, SizeOfInputStructure);
        }
Beispiel #6
0
        /// <summary>
        /// キー入力を行います。
        /// キーストロークをシミュレートすることで入力します。
        /// </summary>
        /// <param name="virtualKeyCode">仮想キーコード。</param>
        public static void InputKey(VirtualKeyCode virtualKeyCode)
        {
            var inputs = ToInputStructure(virtualKeyCode);

            PInvokeFunctions.SendInput(2, inputs, SizeOfInputStructure);
        }
Beispiel #7
0
        /// <summary>
        /// <see cref="INPUT"/>構造体のコレクションを指定して入力を行います。
        /// </summary>
        /// <param name="inputStructures"><see cref="INPUT"/>構造体のコレクション。</param>
        public static void SendInput(IEnumerable <INPUT> inputStructures)
        {
            var array = inputStructures.ToArray();

            PInvokeFunctions.SendInput(array.Length, array, SizeOfInputStructure);
        }