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

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

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

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

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

3回答

5137閲覧

C# WPFでスクリーンキーボードを作成しIMEを切り替える

himhong

総合スコア17

C#

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

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2019/08/17 16:43

編集2019/08/18 06:19

C# WPFでスクリーンキーボードを作成しています。
そのうえで、IMEの切り替え(alt+半角)のような操作をしたいと考えています。
どうやらSendKeys.SendWaitではうまくいかないことまでは分かったのですが、切り替え方法がわかりません。

どなたかご存じの方いましたら教えていただけないでしょうか?
よろしくお願いいたします。


以下質問を整理します。

・オリジナルのスクリーンキーボードを作成したい。
・その際、IMEの切り替えを行う機能を実装したい(実際のキーボードでいう、Alt+半角)。
特定のアプリだけ操作したいわけではなく、すべてのアプリの入力の場面で機能させたい。
・開発環境はC#、WPF。

具体的な方法をどなたかお教えいただけないでしょうか?
よろしくお願いいたします。

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

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

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

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

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

YAmaGNZ

2019/08/18 06:36 編集

ソフトウェアキーボードとのことですが、 ・「IME切替」(例)というボタンを配置し、それを押すことによりIMEの切り替えを行う ・Altキーボタンを押した後、半角全角キーボタンを押す この2つのどちらでしょうか?
himhong

2019/08/18 06:41

・「IME切替」(例)というボタンを配置し、それを押すことによりIMEの切り替えを行う こちらでございます!
guest

回答3

0

keybd_eventのAPIで処理すればいいのではないですかね?
追記:SendInputのほうが推奨なので、使用するならこちらにすべきです。

WindowsFormでソフトキーボードを作成した際にはこちらを使用しました。
こちらにキーコード一覧がありますので参考に

投稿2019/08/17 23:28

編集2019/08/18 02:09
YAmaGNZ

総合スコア10258

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

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

Zuishin

2019/08/17 23:35

SendKeys.SendWait でうまくいかないという話なので、キーを送るウィンドウを間違えていたりするのかもしれませんね。なお keybd_event では処理中にユーザーがキーボードを触ることで不具合が生じる可能性があるということで、SendInput が推奨されています。
YAmaGNZ

2019/08/18 00:08

確かにkeybd_eventではなくSendInputが推奨されているのでご指摘ありがとうございます。 SendKeys系だと「半角/全角」は送れないんじゃなかったでしたっけ?
gentaro

2019/08/18 00:13

質問の本題である「IMEの切り替え」って、「キーコードを送る処理」で実現するもんですかね? IMEの設定で切り替えキーは変えられる(ちょっと特殊なキーボード使ってるんで私は変えてる)から、違う問題だと思ってました。
gentaro

2019/08/18 00:18

あ、やりたいのはキーを送る方で、IMEの切り替えではないのか。誤読してたかも。
YAmaGNZ

2019/08/18 00:18

そのあたりは質問者さん次第ですね。 私は「スクリーンキーボードを作成しています」とあったんで、キーボードエミュレートが目的なのかと勝手に思ってました。
gentaro

2019/08/18 00:23

スクリーンキーボード、と書いてある以上はそちらの解釈が正しい気がしてきました。 失礼いたしました。
Zuishin

2019/08/18 00:24

半角/全角は {Kanji} で送れたと思います。IME の操作はキーカスタマイズできるので API を使うのが本筋だと思いますが、スクリーンキーボードなので対応できそうですね。
Zuishin

2019/08/18 02:45

無くなってるんですね。知りませんでした。 確かに SendKeys では無理そうですね。
himhong

2019/08/18 04:45

ご回答ありがとうございます。 特定のウィンドウのIMEを切り替えたいというのが今回の要件です。 この場合だとsendInputでもIMEの切り替えは難しいという感じでしょうか?
YAmaGNZ

2019/08/18 05:47

SendInputでIMEの切り替えは行えます。ですが、Windows8以降ですとデフォルトの設定でIMEの切り替えはユーザー単位となっているかと思います。 Windows8以降で特定ソフトのみ切り替えたいというのであれば、設定を変更する必要があります。
himhong

2019/08/18 06:04

>Windows8以降で特定ソフトのみ切り替えたいというのであれば、設定を変更する必要があります。 これは具体的に何を変更すればよいのでしょうか?
YAmaGNZ

2019/08/18 06:09

そのあたりは「Windows IME アプリケーションごと」で検索するなりして調べてください。 Windows10に関してはバージョンによって設定までたどり着く方法が違ったりしますので注意してください。
guest

0

ベストアンサー

要件がよくわかんないけど、IME関連で凝った事をしたいならWin32API使うとかそういうアプローチになる気がします。
http://www.kanazawa-net.ne.jp/~pmansato/net/net_tech_ime.htm


追記
ちょっと誤解してた気がします。
IME切り替えが目的なわけでなく、特定のウィンドウにキーを送信したい、という内容であれば、YAmaGNZさんの回答を参考にしてください。

投稿2019/08/17 17:57

編集2019/08/18 00:26
gentaro

総合スコア8949

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

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

himhong

2019/08/18 04:49

夜遅くにご回答ありがとうございます。 特定のウィンドウにてIMEの切り替えを操作したいのでこちらの方法が現実的そうですね。 まだよくわからないのでもう少しじっくりみてみます。 ただalt+半角を押した時の様に切り替えができればいいだけなので、凝ったことをするつもりがなくともそこそこ大変そうですね。 挑戦してみます。
gentaro

2019/08/18 06:09

引用元記事にある > IME に関係する .Net Framework の機能としては、Control クラスまたはそれを継承するクラスの ImeMode プロパティ、および、それに関係するメソッドとイベントだけです。 という記載から、.NETではIMEを直接的に制御する機能がそもそもなく、IMEを直接制御したいならどうしてもWindows APIに行き着く気がします。 (Control.ImeModeについてもソースを追ったら結局Windows APIを叩いてるだけだった)
guest

0

自己解決しました。
User32.dll、SendMessageを使い、IMEの状態の取得、変更ができました。

参考にさせていただいたページは
https://qiita.com/kob58im/items/a1644b36366f4d094a2c
http://robotastics.wpblog.jp/%E6%8A%80%E8%A1%93%E6%83%85%E5%A0%B1/c-net/imestatus-get/
です。

gentaro様、YAmaGNZ様
なかなか要領を得ない中、お教えいただきありがとうございました。

投稿2019/08/18 07:00

編集2019/08/18 07:01
himhong

総合スコア17

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問