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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

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

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Q&A

解決済

2回答

4886閲覧

SendKeys.Sendメソッドを使用した"変換キー"の入力方法

Natsuki_Ueda

総合スコア15

C#

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

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

1グッド

0クリップ

投稿2022/01/27 01:08

概要

C#でタッチキーボードのデスクトップアプリを作成しています.

Windows10には標準でひらがなのタッチキーボードが存在しますが,50音順に並んだ配列のキーボードが必要なため,自作しています.
※使用場面はキーボードを搭載していないwindows10のタブレットを想定しています.

質問は以下の2点です.

  1. SendKeys.Sendメソッドで「変換キー」を押す方法
  2. SendKeys.Sendメソッドに代わる実装方法

質問1

フォーム上にボタンを配置してそれらが押されると,キーボード上の特定のキーがSendKeys.Sendメソッドによって送信されるようになっています.
ひらがなは,それに該当するローマ字を連続して送ることで入力しています.
(例「か」の場合は"ka",エンターキーの場合は"{ENTER}")

入力されたひらがなを漢字に変換するために,変換キーを押す機能もタッチキーボードに入れたいのですが,変換キーに該当するキーコードが見つかりません.
SendKeys.Send以外の方法でも構いませんが,変換キーを操作する方法は何かありますでしょうか.

  • 試したこと1
    こちらにて回答されているキーコード"F13"で試してみましたが,反応がありませんでした.
  • 試したこと2
    スペースキーでも入力中のひらがなを変換できるため,キーコードに空白文字を使用してみましたが,短い間隔で連続して送ると変換ではなく半角空白文字が送られるため,適切ではないと思われます.

質問2

キーボードを操作する方法としてSendKeys.Sendメソッドを使用していますが,質問1の「試したこと1」に載せたリンク先にもあるように,どうやらSendKeys.Sendメソッドの挙動が危険であるという情報がいくつか見受けられました.
これは公式のドキュメントで注意喚起されている"タイミングの問題"にあたるかどうかははっきり分かりませんが,SendKeys.Sendメソッドを使うべきでない理由,またSendKeys.Sendメソッドに代わる実装方法等をご存知でしたら,教えてください.

実装方法が大きく変わるような案でも構いませんので,アイデアをいただけたらと思います.
よろしくお願いします.

TN8001👍を押しています

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

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

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

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

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

guest

回答2

0

メモ帳を起動して、変換キーを押すプログラムです。

最初に、PowerShellで動作確認してみてください。

Add-Type -TypeDefinition @' using System.Runtime.InteropServices; using System; namespace Microsoft { public class Windows { [DllImport("user32.dll")] public static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo); public static void PushKey(byte virtualkey){ keybd_event(virtualkey,0,0 ,0); // キーを押す System.Threading.Thread.Sleep(20); // 一時停止の時間は、ご自身の環境に合わせてください keybd_event(virtualkey,0,0x2,0); // キーを離す } } } '@ # ------------------------------------------------------------------------------- $note = Start-Process "C:\Windows\notepad.exe" -PassThru # メモ帳を起動 [void]$note.WaitForInputIdle() # メモ帳を起動 起動するまで待つ Add-Type -AssemblyName Microsoft.VisualBasic # メモ帳を起動 アセンブリ [Microsoft.VisualBasic.Interaction]::AppActivate($note.id) # メモ帳を起動 アクティブにする $note.Close() # メモ帳を起動 破棄 # ------------------------------------------------------------------------------- [Microsoft.Windows]::PushKey(0xF3) # キーを押す 半角/全角キー [Microsoft.Windows]::PushKey(0x41) # キーを押す aキー [Microsoft.Windows]::PushKey(0x49) # キーを押す iキー [Microsoft.Windows]::PushKey(0x1C) # キーを押す ←←←←←←←←←← 変換キー [Microsoft.Windows]::PushKey(0x0D) # キーを押す Enterキー # ↑ # ↓ # 仮想キーコード一覧 http://kts.sakaiweb.com/virtualkeycodes.html # ------------------------------------------------------------------------------- cmd /c "pause" exit

■手順■

①拡張子ps1ファイルを作成して、このプログラムを貼り付けて保存します。

②ps1ファイルをコンテキストメニューから「PowerShell で実行」を選択します。

実行すると、メモ帳を起動して、変換キーを押します。

期待通りの結果が得られた場合に、C#の部分をご利用ください。

投稿2022/01/27 03:35

ccc-

総合スコア342

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

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

Natsuki_Ueda

2022/01/27 07:43

提示いただいたコードでうまく動作することが確認できました. ただ,keybd_eventに代わる機能としてSendInputメソッドが出ているので,そちらを採用させていただきます. ありがとうございました.
guest

0

ベストアンサー

SendInputはどうでしょうか?
SendInput function (winuser.h) - Win32 apps | Microsoft Docs

C# SendInput 変換

SendKeys.Sendも「新しい実装」では、内部でSendInputを使用しているようですが^^;

投稿2022/01/27 03:06

TN8001

総合スコア9317

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問