質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
.NET

.NETとは、主に.NET Frameworkと呼ばれるアプリケーションまたは開発環境を指します。CLR(共通言語ランタイム)を搭載し、入力された言語をCIL(共通中間言語)に変換・実行することが可能です。そのため、C#やPythonなど複数の言語を用いることができます。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

4379閲覧

C# SendInput 変換

solachalon

総合スコア8

.NET

.NETとは、主に.NET Frameworkと呼ばれるアプリケーションまたは開発環境を指します。CLR(共通言語ランタイム)を搭載し、入力された言語をCIL(共通中間言語)に変換・実行することが可能です。そのため、C#やPythonなど複数の言語を用いることができます。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

1グッド

0クリップ

投稿2021/11/27 07:57

前提・実現したいこと

C#でスクリーンキーボードを作成しています。
英数字やひらがな、カタカナなどの単体の文字が送信できるまでは実装済みです。
例)「あ」、「ア」、「A」など

今回、実現したいのは、windows標準のスクリーンキーボードのように
IMEがひらがな入力の状態で入力できるようにしたいです。
例)「B」キー → 「A」キー → 「変換」キー で入力が「ば」になる

該当のソースコード

以下、SendInputを使用したソースです。
通常時はForms.Keysをshortでキャストしたものをinp.ki.wVkに割り当てていますが、
特殊キーは直接キーコードを入力しています。

INPUT inp = new INPUT(); // 押す inp.type = INPUT_KEYBOARD; inp.ki.wVk = (short)key; inp.ki.wScan = (short)MapVirtualKey(inp.ki.wVk, 0); inp.ki.dwFlags = ((isExtend) ? (KEYEVENTF_EXTENDEDKEY) : 0x0) | KEYEVENTF_KEYDOWN; inp.ki.time = 0; inp.ki.dwExtraInfo = 0; SendInput(1, ref inp, Marshal.SizeOf(inp)); System.Threading.Thread.Sleep(100); // 離す inp.ki.dwFlags = ((isExtend) ? (KEYEVENTF_EXTENDEDKEY) : 0x0) | KEYEVENTF_KEYUP; SendInput(1, ref inp, Marshal.SizeOf(inp));

試したこと

仮想キーコード表に従い、IME関係のキーコードを送信してもIMEが切り替わりませんでした。

補足情報(FW/ツールのバージョンなど)

.NET Fremework 4.5
VisualStudio2013
Windows7で開発

TN8001👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KOZ6.0

2021/11/27 14:49 編集

「C#でSendInputを使う」 https://gist.github.com/dzonesasaki/6cd6facaa77a420250b74704ddf8c311 ここのコピペですか? MOUSEINPUT 構造体 および KEYBDINPUT 構造体の dwExtraInfo メンバは IntPtr です。 32ビットなら動くかもしれませんが、64ビットだと動かないかもです。 MapVirtualKeyA を使ってるのもなんだかなぁ・・・
solachalon

2021/11/28 05:30

そのページではないですが、同じ構成で実装していました。 ご指摘通り、ビット数を全く考えておりませんでした。 ご指摘を参考に実装し直したいと思います。
guest

回答2

0

回答、質問して下さった御二方ありがとうございました。

64bitで動くようにSendInputを実装し、仮装キーコードをkeymillで確認しながらプログラムしたら動作致しました。

ありがとうございました。

投稿2021/11/28 05:34

solachalon

総合スコア8

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

非常に雑ですがほぼ提示コードのままで、こちらの手元では動きました(Windows10 MicrosoftIME)

NuGet Gallery | PInvoke.User32 0.7.104

cs

1using System.Drawing; 2using System.Runtime.InteropServices; 3using System.Windows.Forms; 4using static PInvoke.User32; 5 6namespace Questions371226 7{ 8 public partial class Form1 : Form 9 { 10 public Form1() 11 { 12 InitializeComponent(); 13 TopMost = true; 14 15 var button = new Button() { Text = "VK_KANJI", }; 16 button.Click += (s, e) => Send(VirtualKey.VK_KANJI); 17 Controls.Add(button); 18 19 var button2 = new Button() { Text = "VK_A", Location = new Point(0, 50), }; 20 button2.Click += (s, e) => Send(VirtualKey.VK_A); 21 Controls.Add(button2); 22 } 23 24 private static unsafe void Send(VirtualKey key) 25 { 26 var isExtend = false; 27 var inp = new INPUT 28 { 29 type = InputType.INPUT_KEYBOARD 30 }; 31 inp.Inputs.ki.wVk = key; 32 inp.Inputs.ki.wScan = (ScanCode)MapVirtualKey((int)inp.Inputs.ki.wVk, MapVirtualKeyTranslation.MAPVK_VK_TO_VSC); 33 inp.Inputs.ki.dwFlags = isExtend ? KEYEVENTF.KEYEVENTF_EXTENDED_KEY : 0x0; 34 inp.Inputs.ki.time = 0; 35 //inp.Inputs.ki.dwExtraInfo = 0; 36 SendInput(1, &inp, Marshal.SizeOf(inp)); 37 38 //System.Threading.Thread.Sleep(100); 39 40 inp.Inputs.ki.dwFlags = (isExtend ? KEYEVENTF.KEYEVENTF_EXTENDED_KEY : 0x0) | KEYEVENTF.KEYEVENTF_KEYUP; 41 SendInput(1, &inp, Marshal.SizeOf(inp)); 42 } 43 44 protected override CreateParams CreateParams 45 { 46 get 47 { 48 var p = base.CreateParams; 49 if (!DesignMode) p.ExStyle |= (int)SetWindowLongFlags.WS_EX_NOACTIVATE; 50 return p; 51 } 52 } 53 } 54}

わたしもWPFでソフトキーボード作ったのですが、その時は↓のようなツールが非常に便利でした。
KT Software - Keymill

リアルキーボードとの違いを探ってみてはいかがでしょうか。

投稿2021/11/27 10:55

編集2023/07/29 10:12
TN8001

総合スコア9862

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問