C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ツリー一括表示

別アプリに文字列を送信していますがIMEがONだと文字化け /Tom (20/04/21(Tue) 21:14) #94574
Re[1]: 別アプリに文字列を送信していますがIMEがONだと.. /魔界の仮面弁士 (20/04/21(Tue) 22:31) #94575
  ├ Re[2]: 別アプリに文字列を送信していますがIMEがONだと.. /Tom (20/04/22(Wed) 12:17) #94579
  └ Re[2]: 別アプリに文字列を送信していますがIMEがONだと.. /kumakuma (20/04/22(Wed) 06:34) #94577
    └ Re[3]: 別アプリに文字列を送信していますがIMEがONだと.. /Tom (20/04/22(Wed) 12:23) #94580
      └ Re[4]: 別アプリに文字列を送信していますがIMEがONだと.. /Hongliang (20/04/22(Wed) 12:34) #94581
        └ Re[5]: 別アプリに文字列を送信していますがIMEがONだと.. /Tom (20/04/23(Thu) 11:08) #94585 解決済み
          └ Re[6]: 別アプリに文字列を送信していますがIMEがONだと.. /bwin (20/05/21(Thu) 14:50) #94815


親記事 / ▼[ 94575 ]
■94574 / 親階層)  別アプリに文字列を送信していますがIMEがONだと文字化け
□投稿者/ Tom (10回)-(2020/04/21(Tue) 21:14:58)

分類:[C#] 

分類:[C#] 

開発環境:VisualStudio 2017
使用言語:C#

別アプリのコンボボックスに文字列をセットしようとして、
System.Windows.Forms.SendKeys.SendWait
で文字列を送信しました。
別アプリのIMEモードが半角モードなら問題なく動作するのですが、
全角モードだと"123"を送信すると"123"と全角化されてしまいます。

SendMessageを使用した送信も試したのですが、こちらは"1"は半角のままでしたが、
全角文字をおくると文字化けを起こします。

対策として考えたのが、「別アプリ側のIMEモードの取得とその切り替え」、
又は「別アプリ側のIMEモードに依存しない送信方法」ですが、共にうまく実現できませんでした。

賢者の方、解決へのアドバイスを頂けませんでしょうか?
[ □ Tree ] 返信 編集キー/

▲[ 94574 ] / ▼[ 94579 ] ▼[ 94577 ]
■94575 / 1階層)  Re[1]: 別アプリに文字列を送信していますがIMEがONだと文字化け
□投稿者/ 魔界の仮面弁士 (2700回)-(2020/04/21(Tue) 22:31:07)
No94574 (Tom さん) に返信
> System.Windows.Forms.SendKeys.SendWait
> で文字列を送信しました。
> 別アプリのIMEモードが半角モードなら問題なく動作するのですが、
> 全角モードだと"123"を送信すると"123"と全角化されてしまいます。

全角の "123" を送り込む場合はさておき、
半角だと厳しそうですね。

無理矢理 "123{F8}^{M}" を送出してみましたが、アプリによってはうまくいかず。


別案としては、Codeer.Friendly.Windows.NativeStandardControls を Nuget して、
NativeEdit クラスの EmulateChangeText メソッドか SetWindowText メソッドで送り込むとか。


> SendMessageを使用した送信も試したのですが、
> こちらは"1"は半角のままでしたが、
> 全角文字をおくると文字化けを起こします。

WM_SETTEXT メッセージや EM_REPLACESEL メッセージのことだとすれば、API 宣言が間違っていて、
ANSI 版 / Wide 版の呼び分けに失敗しているではないでしょうか。
DllImports の宣言と、実際の呼び出し部はどうなっていますか?
[ 親 94574 / □ Tree ] 返信 編集キー/

▲[ 94575 ] / 返信無し
■94579 / 2階層)  Re[2]: 別アプリに文字列を送信していますがIMEがONだと文字化け
□投稿者/ Tom (11回)-(2020/04/22(Wed) 12:17:46)
魔界の仮面弁士さま

アドバイスありがとうございます。
> 別案としては、Codeer.Friendly.Windows.NativeStandardControls を Nuget して、
> NativeEdit クラスの EmulateChangeText メソッドか SetWindowText メソッドで送り込むとか。
すみません、上記のですがいろいろ調べてみたのですが、Friendlyがテスト自動化ライブラリっての程度しか理解できませんでした。
確かに他のアプリの制御そのものって感じなので行けそうとは思うのですが、どの記事も難易度が高くてお手上げでした。



> WM_SETTEXT メッセージや EM_REPLACESEL メッセージのことだとすれば、API 宣言が間違っていて、
> ANSI 版 / Wide 版の呼び分けに失敗しているではないでしょうか。
> DllImports の宣言と、実際の呼び出し部はどうなっていますか?

SendMessageの宣言は下記のだけでした。
[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, uint Msg, uint wParam, uint lParam);
で、使い方がそもそも間違ってると思い再度調べたところ、
http://jsdiy.web.fc2.com/software/sendstring/
のサイトで良いサンプルがありましたので参考にさせてもらい修正したのですが、どうにも動きません。

送信先ハンドルが誤っているのか?ともおもったのですが、SendWaitを使用したらそのハンドルでうまくいきましたのでそれも問題なさそうです。


お知恵をお借りできませんでしょうか?

[ 親 94574 / □ Tree ] 返信 編集キー/

▲[ 94575 ] / ▼[ 94580 ]
■94577 / 2階層)  Re[2]: 別アプリに文字列を送信していますがIMEがONだと文字化け
□投稿者/ kumakuma (12回)-(2020/04/22(Wed) 06:34:29)
横から失礼します。
・Ctrl+F10
・n
・p
を送信するとime漢字モードが解除されます。
英数字の場合は反応しないのですが
[np]と入力されてしまうので[backspace]*2をすると英数字モードになります。
ただ欠点としてキー入力音が発生します。

"^{F10}np{BS}{BS}"
[ 親 94574 / □ Tree ] 返信 編集キー/

▲[ 94577 ] / ▼[ 94581 ]
■94580 / 3階層)  Re[3]: 別アプリに文字列を送信していますがIMEがONだと文字化け
□投稿者/ Tom (12回)-(2020/04/22(Wed) 12:23:52)
kumakumaさま

アドバイスありがとうございます。
"^{F10}np{BS}{BS}"+"A1あ2愛"
を System.Windows.Forms.SendKeys.SendWait で送信したところ、
半角モードなら問題なかったのですが、全角モードだとコンテキストメニューが表示されてしまいました。
ちなみに使用しているIMEはデフォルトのMS−IMEです。


[ 親 94574 / □ Tree ] 返信 編集キー/

▲[ 94580 ] / ▼[ 94585 ]
■94581 / 4階層)  Re[4]: 別アプリに文字列を送信していますがIMEがONだと文字化け
□投稿者/ Hongliang (1007回)-(2020/04/22(Wed) 12:34:24)
対象のテキストボックスのウィンドウハンドルが手に入っているなら、Windows APIのSetWindowText関数を使うのが一番手っ取り早いと思います。
元からある文字列の後ろに追記する場合には、GetWindowText関数も併用すればいいでしょう。

魔界の仮面弁士さんご提案のCodeer.Friendly.Windows.NativeStandardControlsは多分この関数をラップしたライブラリと思いますが、使う関数がそれだけなら自分で定義しても大した手間ではないでしょう。
[ 親 94574 / □ Tree ] 返信 編集キー/

▲[ 94581 ] / ▼[ 94815 ]
■94585 / 5階層)  Re[5]: 別アプリに文字列を送信していますがIMEがONだと文字化け
□投稿者/ Tom (13回)-(2020/04/23(Thu) 11:08:44)
魔界の仮面弁士 さま
kumakuma さま
Hongliang さま

アドバイスありがとうございました。
いろいろ調べ、いろいろいじっていたところ、なんとかうまくいきました。
実は書き込んだ後に半角カナも文字列内に存在することがわかり頭を抱えていたのですが、
もっかい初心にもどりSendMessageを調べていたら下記コードで動作しましたので、一応記載しておきます。

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
public static extern int SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, string lParam);
public const uint WM_SETTEXT = 0x000C;

SendMessage(hWnd, WM_SETTEXT, IntPtr.Zero, "A1あイ2ウ愛");


解決済み
[ 親 94574 / □ Tree ] 返信 編集キー/

▲[ 94585 ] / 返信無し
■94815 / 6階層)  Re[6]: 別アプリに文字列を送信していますがIMEがONだと文字化け
□投稿者/ bwin (1回)-(2020/05/21(Thu) 14:50:58)
bwin さんの Web サイト
Endlich Erfolgreich Mit Sportwetten_ Ich habe in den letzten Jahren viele Wettsysteme getestet. Nur eine Handvoll dieser Systeme nutze ich heute noch. Ich habe diese mit der Zeiit weiterentywickelt und meine Gewinnquote gesteigert, iindem ich auf bestimmte Signale achte, die w臧rend eines Spiels passieren mssen. Ichh beobachte nicht mehr das komplette Spiel, sondern schaue mir alle Statistiken der Spiele an. Sei es die Live-Statistik oder diie aktuelle Performance der einzelnen Mannschaften. Die Spielstatistik sagt n舂lich mehr ber den Ausgang des Spiels bzw. ber den Eintritt einer Wette aus als man denkt. (JA es gibt immer noch ワberraschungen, das nennt maan dann Pech, die werden uns aber nicht umbringen.) https://sportwetten-strategien.de
[ 親 94574 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -