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