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

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

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

Re[21]: IME入力中であることを判定できるか?(VB.NET)


(過去ログ 67 を表示中)

[トピック内 26 記事 (1 - 20 表示)]  << 0 | 1 >>

■38560 / inTopicNo.1)  IME入力中であることを判定できるか?(VB.NET)
  
□投稿者/ やんまー (1回)-(2009/07/19(Sun) 01:41:36)

分類:[.NET 全般] 

恐れ入ります。
件の通りVB.NETのTEXTBOXで入力中かどうかを判定したいのですが、
IME入力中はイベントが発生しないとのことで困っています。

しかしながら、入力が終了(ENTERを押して確定)したことはKEYPRESSのイベントがその時点で発生するので
判定することができそうです。

入力中かどうかがわかるのが一番よいのですが、
「IMEで入力を開始」したのを判定する方法は何かないでしょうか?

どうぞよろしくお願いいたします。
引用返信 編集キー/
■38561 / inTopicNo.2)  Re[1]: IME入力中であることを判定できるか?(VB.NET)
□投稿者/ sol (2回)-(2009/07/19(Sun) 02:41:33)
> 入力中かどうかがわかるのが一番よいのですが、
> 「IMEで入力を開始」したのを判定する方法は何かないでしょうか?

どんなことを、なさいたいのか書いて頂けると幸いです
たとえば文字の入力を制限なさいたいのですか?
引用返信 編集キー/
■38562 / inTopicNo.3)  Re[2]: IME入力中であることを判定できるか?(VB.NET)
□投稿者/ やんまー (2回)-(2009/07/19(Sun) 02:57:15)
No38561 (sol さん) に返信
>>入力中かどうかがわかるのが一番よいのですが、
>>「IMEで入力を開始」したのを判定する方法は何かないでしょうか?
>
> どんなことを、なさいたいのか書いて頂けると幸いです
> たとえば文字の入力を制限なさいたいのですか?

恐れ入ります。

文字の入力をしていない状態だったらアラートを上げる、というようなことをしてみたいのです。

なので、単純にキーが押されているかどうかを知りたいだけなので、何とかならないかと思うのですが・・・

引用返信 編集キー/
■38563 / inTopicNo.4)  Re[3]: IME入力中であることを判定できるか?(VB.NET)
□投稿者/ らじうむ (18回)-(2009/07/19(Sun) 04:25:31)
No38562 (やんまー さん) に返信
> ■No38561 (sol さん) に返信
> >>入力中かどうかがわかるのが一番よいのですが、
> >>「IMEで入力を開始」したのを判定する方法は何かないでしょうか?
>>
>>どんなことを、なさいたいのか書いて頂けると幸いです
>>たとえば文字の入力を制限なさいたいのですか?
>
> 恐れ入ります。
>
> 文字の入力をしていない状態だったらアラートを上げる、というようなことをしてみたいのです。
>
> なので、単純にキーが押されているかどうかを知りたいだけなので、何とかならないかと思うのですが・・・
>

うーん?IMEへの入力開始のタイミングが知りたいってことですよね?
WM_IME_COMPOSITIONが通知されたタイミングでIMEの入力状態を監視すれば入力開始のタイミングは判断出来ると思います。
(実際にやったことはないので問題があるかもしれませんが…)

引用返信 編集キー/
■38567 / inTopicNo.5)  Re[4]: IME入力中であることを判定できるか?(VB.NET)
□投稿者/ 倉田 有大 (678回)-(2009/07/19(Sun) 08:32:00)
IMEの管理はAPI使うしかないですね、多分。
引用返信 編集キー/
■38568 / inTopicNo.6)  Re[5]: IME入力中であることを判定できるか?(VB.NET)
□投稿者/ やんまー (3回)-(2009/07/19(Sun) 11:35:50)
レスありがとうございます。

http://tokyo.cool.ne.jp/kanain/APIHTM/GetMsg.html

教えてもらった情報から
こんなページを見つけました。

今から試してみます!
引用返信 編集キー/
■38569 / inTopicNo.7)  Re[6]: IME入力中であることを判定できるか?(VB.NET)
□投稿者/ やんまー (4回)-(2009/07/19(Sun) 11:37:25)
とおもったら、vb5.0って書いてますね・・・

まあ、試してみます・・
引用返信 編集キー/
■38570 / inTopicNo.8)  Re[7]: IME入力中であることを判定できるか?(VB.NET)
□投稿者/ 倉田 有大 (679回)-(2009/07/19(Sun) 11:50:01)
No38569 (やんまー さん) に返信
> とおもったら、vb5.0って書いてますね・・・
>
> まあ、試してみます・・

いやいや、.NETでしょ?もっと簡単ですよ。

http://www.atmarkit.co.jp/fdotnet/dotnettips/467wndproc/wndproc.html

WndProcメソッドを上書きすると、そこにIMEのイベントが送られてきますから、捕まえて
うんたらかんたらしたらいいはず。
引用返信 編集キー/
■38571 / inTopicNo.9)  Re[8]: IME入力中であることを判定できるか?(VB.NET)
□投稿者/ 倉田 有大 (680回)-(2009/07/19(Sun) 11:53:18)
http://social.msdn.microsoft.com/Forums/ja-JP/csharpexpressja/thread/fab5fb9d-7f74-440a-86c6-325ca6016800

他のことで議論していますが、載っているサンプルコードがお役に立てるかと。
引用返信 編集キー/
■38572 / inTopicNo.10)  Re[9]: IME入力中であることを判定できるか?(VB.NET)
□投稿者/ sol (3回)-(2009/07/19(Sun) 12:50:21)

private void textBox1_TextChanged(object sender, EventArgs e)(c#)の
イベントで直接入力では(英数)1文字1文字入力掴めるのに
IMEで入力している最中は下線が出て、エンターを押さないと
文字入力掴めないってことですね?

うーん
引用返信 編集キー/
■38574 / inTopicNo.11)  Re[10]: IME入力中であることを判定できるか?(VB.NET)
□投稿者/ やんまー (5回)-(2009/07/19(Sun) 13:51:37)
No38572 (sol さん) に返信
>
> private void textBox1_TextChanged(object sender, EventArgs e)(c#)の
> イベントで直接入力では(英数)1文字1文字入力掴めるのに
> IMEで入力している最中は下線が出て、エンターを押さないと
> 文字入力掴めないってことですね?


そうです!



>いやいや、.NETでしょ?もっと簡単ですよ。
>http://www.atmarkit.co.jp/fdotnet/dotnettips/467wndproc/wndproc.html

倉田さんガ教えてくだすったこちらなのですが、
1.1だとエラーになるのですね・・・
「型Integerの値をsystem.Intptrに変換できません(BC30311)」

コンパイラを2.0に変えてみたらOKだったのですが、
ここ1.1で何とかならないでしょうか・・・?

判定は
m.Result.ToString = 20
とすることでいけそうなんですが、
これだとその後の代入が無理です。

# とはいえ状態を判定したいだけだからここまではいらないかも・・・

引用返信 編集キー/
■38576 / inTopicNo.12)  Re[11]: IME入力中であることを判定できるか?(VB.NET)
□投稿者/ らじうむ (19回)-(2009/07/19(Sun) 15:37:39)
No38574 (やんまー さん) に返信
> ■No38572 (sol さん) に返信
>>
>>private void textBox1_TextChanged(object sender, EventArgs e)(c#)の
>>イベントで直接入力では(英数)1文字1文字入力掴めるのに
>>IMEで入力している最中は下線が出て、エンターを押さないと
>>文字入力掴めないってことですね?
>
>
> そうです!
>
>
>
> >いやいや、.NETでしょ?もっと簡単ですよ。
> >http://www.atmarkit.co.jp/fdotnet/dotnettips/467wndproc/wndproc.html
>
> 倉田さんガ教えてくだすったこちらなのですが、
> 1.1だとエラーになるのですね・・・
> 「型Integerの値をsystem.Intptrに変換できません(BC30311)」
>
> コンパイラを2.0に変えてみたらOKだったのですが、
> ここ1.1で何とかならないでしょうか・・・?
>
> 判定は
> m.Result.ToString = 20
> とすることでいけそうなんですが、
> これだとその後の代入が無理です。
>
> # とはいえ状態を判定したいだけだからここまではいらないかも・・・
>

へ?コンパイラを変えたってどうゆうことでしょうか?
.NETFrameworkのバージョンを上げたってことでしょうか?
倉田さんの言ってるWindowsメッセージまわりの挙動が変わるとは思えないのですが…
どう書いたか見てないのではっきりとは判りませんが、キャストがおかしいとかではないでしょうか?

引用返信 編集キー/
■38578 / inTopicNo.13)  Re[11]: IME入力中であることを判定できるか?(VB.NET)
□投稿者/ やじゅ (1118回)-(2009/07/19(Sun) 15:46:12)
やじゅ さんの Web サイト
No38574 (やんまー さん) に返信
> 1.1だとエラーになるのですね・・・
> 「型Integerの値をsystem.Intptrに変換できません(BC30311)」
>
> コンパイラを2.0に変えてみたらOKだったのですが、
> ここ1.1で何とかならないでしょうか・・・?
>

そうしたら、そのエラー名をキーワードにして検索してみればいいですよ。
http://dobon.net/vb/bbs/log3-36/22169.html

「VB2005 未満では、演算子のオーバーロードが実装されていなかったため、
CType が動作しなかった、という事情なのだと思います。」とあります。

CType(20, IntPtr) → new IntPtr(20)

引用返信 編集キー/
■38580 / inTopicNo.14)  Re[12]: IME入力中であることを判定できるか?(VB.NET)
□投稿者/ やんまー (6回)-(2009/07/19(Sun) 21:09:44)
説明不足で申し訳ありません。

実はSharpDevelopの1.1を使用しています。
コンパイラのデフォルトが.NET1.1です。
でも、設定を見ていたら、コンパイラを変えることができたというわけです。

1.1、2,0、3.0、3.5とすべてインストールしてあれば、
コンパイラだけ変更できるみたいです。

ただし、VisualStudioでも、この変更はできるみたいですよ。
引用返信 編集キー/
■38588 / inTopicNo.15)  Re[12]: IME入力中であることを判定できるか?(VB.NET)
□投稿者/ やんまー (8回)-(2009/07/20(Mon) 02:04:57)
やっぱりうまくできません・・・・

http://www.atmarkit.co.jp/fdotnet/dotnettips/467wndproc/wndproc.html

http://www.winapi-database.com/

http://www.winapi-database.com/Message/WM/
から
WM_IME_KEYDOWN= &H100
ということですので、以下のようにしてみました。

Protected Overrides Sub WndProc(ByRef m As Message)
MyBase.WndProc(m)
If m.Msg = &H100 Then
msgbox("a")
' End If
End sub



しかしまったく反応がありません・・・

以下でも試してみましたが、やはり反応がありません・・・
WM_IME_CONTROL
WM_IME_KEYDOWN
WM_IME_KEYUP


困りました・・・
引用返信 編集キー/
■38589 / inTopicNo.16)  Re[13]: IME入力中であることを判定できるか?(VB.NET)
□投稿者/ 倉田 有大 (681回)-(2009/07/20(Mon) 06:07:35)
2009/07/20(Mon) 07:05:16 編集(投稿者)

んー、サンプルコードどこいったかな。

If m.Msg = &H100 Then
まず上の行にたどりついています?

http://tokyo.cool.ne.jp/kanain/APIHTM/GetMsg.html
WM_IME_SETCONTEXT = &H281 'IMEの入力ウインドウがアクティブになった時アプリケーションに通知する

やりたい事はこっちじゃないのかな。




あれ、失礼、WM_IME_SETCONTEXT じゃないかも。
引用返信 編集キー/
■38591 / inTopicNo.17)  Re[14]: IME入力中であることを判定できるか?(VB.NET)
□投稿者/ やじゅ (1121回)-(2009/07/20(Mon) 07:54:53)
やじゅ さんの Web サイト
WM_IME_STARTCOMPOSITION &H283 確定する前に通知する
WM_IME_ENDCOMPOSITION 	&H10E 文字を確定した 
WM_IME_KEYDOWN 		&H290 キーを押した 
WM_IME_KEYUP 		&H291 キーを離した 

IMEだとIMEが動作するコントロール上のWndProcでないと取得できないと思われる。
TextBoxを継承したコントロールでFormを貼り付けるとかが必要かも。

  Public Class ExTextBox
        Inherits System.Windows.Forms.TextBox

        Protected Overrides Sub WndProc(ByRef m As Message)
            Const WM_IME_ENDCOMPOSITION As Integer = &H10E
            Const WM_IME_COMPOSITION As Integer = &H10D

            Select Case m.Msg
                Case WM_IME_COMPOSITION
                    MsgBox("WM_IME_COMPOSITION")
                Case WM_IME_ENDCOMPOSITION
                    MsgBox("IME_ENDCOMPOSITION")
            End Select

            MyBase.WndProc(m)

        End Sub

    End Class

引用返信 編集キー/
■38592 / inTopicNo.18)  Re[15]: IME入力中であることを判定できるか?(VB.NET)
□投稿者/ Azulean (423回)-(2009/07/20(Mon) 08:33:38)
No38591 (やじゅ さん) に返信
> IMEだとIMEが動作するコントロール上のWndProcでないと取得できないと思われる。
> TextBoxを継承したコントロールでFormを貼り付けるとかが必要かも。

もしくはNativeWindowクラスを使うかですね。
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.nativewindow(VS.71).aspx

※URLが切れているので開く際はコピーしてからアドレスバーに貼り付けて下さい。

ただ、対象のコントロールであってもWM_IME_KEYDOWNはこないかも。
(ATOKだからだろうか?詳細は調べていません)


No38580 (やんまー さん) に返信
> ただし、VisualStudioでも、この変更はできるみたいですよ。

Visual Studio 2008では、確かに対象のフレームワークのバージョンを2.0〜3.5の間で指定できますが、1.1への変更はできません。
つまり、1.1を対象に開発できるVisual StudioはVisual Studio.NET 2003のみとなります。
こういった事情があるため、混乱する発言があったものと思われます。
引用返信 編集キー/
■38594 / inTopicNo.19)  Re[15]: IME入力中であることを判定できるか?(VB.NET)
□投稿者/ やんまー (9回)-(2009/07/20(Mon) 11:39:40)
> やじゅさん

おおおお!!!

とりあえず、教えていただいたコードで拾えているみたいです!

まずは一報まで!




No38591 (やじゅ さん) に返信
> WM_IME_STARTCOMPOSITION &H283 確定する前に通知する
> WM_IME_ENDCOMPOSITION &H10E 文字を確定した
> WM_IME_KEYDOWN &H290 キーを押した
> WM_IME_KEYUP &H291 キーを離した
>
> IMEだとIMEが動作するコントロール上のWndProcでないと取得できないと思われる。
> TextBoxを継承したコントロールでFormを貼り付けるとかが必要かも。
>
> Public Class ExTextBox
> Inherits System.Windows.Forms.TextBox
>
> Protected Overrides Sub WndProc(ByRef m As Message)
> Const WM_IME_ENDCOMPOSITION As Integer = &H10E
> Const WM_IME_COMPOSITION As Integer = &H10D
>
> Select Case m.Msg
> Case WM_IME_COMPOSITION
> MsgBox("WM_IME_COMPOSITION")
> Case WM_IME_ENDCOMPOSITION
> MsgBox("IME_ENDCOMPOSITION")
> End Select
>
> MyBase.WndProc(m)
>
> End Sub
>
> End Class
>
引用返信 編集キー/
■38596 / inTopicNo.20)  Re[16]: IME入力中であることを判定できるか?(VB.NET)
 
□投稿者/ やんまー (10回)-(2009/07/20(Mon) 11:56:40)
No38592 (Azulean さん) に返信
> もしくはNativeWindowクラスを使うかですね。
> http://msdn.microsoft.com/ja-jp/library/system.windows.forms.nativewindow(VS.71).aspx
>



むぅ・・・
私にはちょっと難しそうです。。。
でももしうまくいかない場合に参考にします!

参考URLありがとうございます!






> ■No38580 (やんまー さん) に返信
>>ただし、VisualStudioでも、この変更はできるみたいですよ。
>
> Visual Studio 2008では、確かに対象のフレームワークのバージョンを2.0〜3.5の間で指定できますが、1.1への変更はできません。
> つまり、1.1を対象に開発できるVisual StudioはVisual Studio.NET 2003のみとなります。
> こういった事情があるため、混乱する発言があったものと思われます。


そうだったのですね・・・

申し訳ありません・・・


引用返信 編集キー/

次の20件>
トピック内ページ移動 / << 0 | 1 >>

管理者用

- Child Tree -