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

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

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

Re[5]: vb.net(2008)テキストBOX IME制御


(過去ログ 84 を表示中)

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

■49849 / inTopicNo.1)  vb.net(2008)テキストBOX IME制御
  
□投稿者/ Morio (4回)-(2010/05/20(Thu) 16:16:10)

分類:[.NET 全般] 

VB.net(2008)を使用して、IMEのソフトキー画面を作っています。

実際には、VB6.0のマイグレーションしたソースが動かないので、悩んでいます。

テストツールを作成して、テキストBOXのIMEの動きを確認していますが、うまく動作してくれません。

  from1に、テキストボックスを配置
  Form1_Activatedにて、下記記述をして、テキストBOXをIME制御しようとしています。
  結構、単純な構成です。

Dim lngImeContext As IntPtr '入力コンテキストの取得用
Dim result As Long
Dim lpdw As Long
Dim lpdw2 As Long
Dim conv As Long

'@テキストBOXのハンドル値からコンテキストを取得
lngImeContext = ImmGetContext(TextBox1.Handle)
'AIMEのOPEN処理
result = ImmSetOpenStatus(lngImeContext, True)
'B現在のIMEの状態を取得
result = ImmGetConversionStatus(lngImeContext, lpdw, lpdw2)
'CIMEへ全角ローマ字変換の状態に設定
result = ImmSetConversionStatus(lngImeContext, 25, lpdw2)

上記と同様の記述をVB6で行った場合、Bの状態取得で、第2引数、題3引数にはIME状態の値が帰ってくるのに対して
上記の場合に、値が0のままで取得ができません。
ただし、テキストBOXは、全角モードになっている。

Cを実施すると、半角英数に変わってしまう。Cの第2引数を変更しても、モードは変わらないです。

APIの定義内容も下記に記載します。
ImmGetConversionStatusの宣言の仕方が悪いのかな?とも思いますが、何か根本的な問題とも思っています。
    
どなたか、ご教授いただけますよう、お願いいたします。


Public Declare Function ImmGetContext Lib "imm32.dll" _
(ByVal Handle As Int32) As Int32

Public Declare Function ImmSetOpenStatus Lib "imm32.dll" _
Alias "ImmSetOpenStatus" (ByVal himc As Int32, ByVal fOpen As Integer) As Int32

Public Declare Function ImmGetConversionStatus Lib "imm32.dll" _
(ByVal himc As Long, ByVal lpdw As Long, ByVal lpdw2 As Long) As Long
Public Declare Function ImmSetConversionStatus Lib "imm32.dll" _
(ByVal himc As Long, ByVal dw1 As Long, ByVal dw2 As Long) As Long

引用返信 編集キー/
■49850 / inTopicNo.2)  Re[1]: vb.net(2008)テキストBOX IME制御
□投稿者/ aetos (294回)-(2010/05/20(Thu) 16:25:22)
2010/05/20(Thu) 16:26:14 編集(投稿者)
2010/05/20(Thu) 16:25:45 編集(投稿者)

No49849 (Morio さん) に返信
> Public Declare Function ImmGetContext Lib "imm32.dll" _
> (ByVal Handle As Int32) As Int32
>
> Public Declare Function ImmSetOpenStatus Lib "imm32.dll" _
> Alias "ImmSetOpenStatus" (ByVal himc As Int32, ByVal fOpen As Integer) As Int32
>
> Public Declare Function ImmGetConversionStatus Lib "imm32.dll" _
> (ByVal himc As Long, ByVal lpdw As Long, ByVal lpdw2 As Long) As Long
> Public Declare Function ImmSetConversionStatus Lib "imm32.dll" _
> (ByVal himc As Long, ByVal dw1 As Long, ByVal dw2 As Long) As Long

ハンドルやポインタの類は IntPtr にしましょう。
また、VB6 と VB.NET では Long のサイズが違います。VB6 の Long は VB.NET では Integer になります。
こんな感じかな?

Public Declare Function ImmGetContext Lib "imm32.dll" _
(ByVal Handle As IntPtr) As IntPtr

Public Declare Function ImmSetOpenStatus Lib "imm32.dll" _
Alias "ImmSetOpenStatus" (ByVal himc As IntPtr, ByVal fOpen As Boolean) As Boolean

Public Declare Function ImmGetConversionStatus Lib "imm32.dll" _
(ByVal himc As IntPtr, ByRef lpdw As Integer, ByRef lpdw2 As Integer) As Boolean

Public Declare Function ImmSetConversionStatus Lib "imm32.dll" _
(ByVal himc As IntPtr, ByVal dw1 As Integer, ByVal dw2 As Integer) As Boolean
引用返信 編集キー/
■49851 / inTopicNo.3)  Re[2]: vb.net(2008)テキストBOX IME制御
□投稿者/ aetos (295回)-(2010/05/20(Thu) 16:28:40)
あれ?
ImmReleaseContext が抜けてない?
引用返信 編集キー/
■49852 / inTopicNo.4)  Re[3]: vb.net(2008)テキストBOX IME制御
□投稿者/ Hongliang (629回)-(2010/05/20(Thu) 16:38:01)
IME の初期状態設定するだけなら ImeMode プロパティをあらかじめ設定しとくだけで十分だと思いますが……。
引用返信 編集キー/
■49859 / inTopicNo.5)  Re[4]: vb.net(2008)テキストBOX IME制御
□投稿者/ Morio (5回)-(2010/05/20(Thu) 23:24:45)
No49852 (Hongliang さん) に返信
> IME の初期状態設定するだけなら ImeMode プロパティをあらかじめ設定しとくだけで十分だと思いますが……。

aetosさん、Hongliang さんありがとうございます。
やはり、API宣言がまちがっていました。
実行してみます。

引用返信 編集キー/
■50044 / inTopicNo.6)  Re[5]: vb.net(2008)テキストBOX IME制御
□投稿者/ Morio (6回)-(2010/05/27(Thu) 08:37:19)
No49859 (Morio さん) に返信
> ■No49852 (Hongliang さん) に返信
>>IME の初期状態設定するだけなら ImeMode プロパティをあらかじめ設定しとくだけで十分だと思いますが……。
>
> aetosさん、Hongliang さんありがとうございます。
> やはり、API宣言がまちがっていました。
> 実行してみます。
>
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -