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

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

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

Re[2]: VB.netによるIMEの変換について


(過去ログ 173 を表示中)

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

■99878 / inTopicNo.1)  VB.netによるIMEの変換について
  
□投稿者/ くま (203回)-(2022/06/15(Wed) 10:45:55)

分類:[VB.NET/VB2005 以降] 

※投稿させて頂きましたがうまく投稿できていなかったようなので再投稿させて頂きます。
 重複していたらすぐにこちらを削除致します。

Windowsの設定 - キーボードの詳細設定 - 『アプリウィンドウごとに異なる入力方式を設定する』にチェックを入れない状態で
IMEモードを切り替える方法をご教示頂けないでしょうか。

上記設定はお客様都合で変更することができません。

色々と調べてIMEモードの切り替え方法は何通りかあったので見よう見まねで実装しましたが反映されず困っています。

◆環境
・WindowsServer 2019
・VB 2019
・Grapecity Inputmanを使用

◆現状のコード
    'Declareステートメント
    Private Declare Function ImmGetContext Lib "imm32.dll" (ByVal Handle As IntPtr) As IntPtr
    Private Declare Function ImmSetOpenStatus Lib "imm32.dll" (ByVal himc As IntPtr, <MarshalAs(UnmanagedType.Bool)> ByVal fOpen As Boolean) As <MarshalAs(UnmanagedType.Bool)> Boolean
    Private Declare Function ImmGetConversionStatus Lib "imm32.dll" (ByVal himc As IntPtr, ByRef lpdw As Integer, ByRef lpdw2 As Integer) As <MarshalAs(UnmanagedType.Bool)> Boolean
    Private Declare Function ImmSetConversionStatus Lib "imm32.dll" (ByVal himc As IntPtr, ByVal dw1 As Integer, ByVal dw2 As Integer) As <MarshalAs(UnmanagedType.Bool)> Boolean
    Private Declare Function ImmReleaseContext Lib "imm32.dll" (ByVal hWnd As IntPtr, ByVal hIMC As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean

    '英数字入力モード
    Private Const IME_CMODE_ALPHANUMERIC As Integer = &H0
    '言語依存入力モード
    Private Const IME_CMODE_NATIVE As Integer = &H1
    '日本語入力モード
    Private Const IME_CMODE_JAPANESE As Integer = IME_CMODE_NATIVE
    'カタカナ入力モード
    Private Const IME_CMODE_KATAKANA As Integer = &H2
    '言語入力モード
    Private Const IME_CMODE_LANGUAGE As Integer = &H3
    '全角入力モード
    Private Const IME_CMODE_FULLSHAPE As Integer = &H8
    'ローマ字入力モード
    Private Const IME_CMODE_ROMAN As Integer = &H10

    '無変換モード
    Private Const IME_SMODE_NONE As Integer = &H0
    '複数文字変換モード
    Private Const IME_SMODE_PLAURALCLAUSE As Integer = &H1
    '単一文字変換モード
    Private Const IME_SMODE_SINGLECONVERT As Integer = &H2
    '自動変換モード
    Private Const IME_SMODE_AUTOMATIC As Integer = &H4
    'IME_SMODE_PHRASEPREDICT 
    Private Const IME_SMODE_PHRASEPREDICT As Integer = &H8


    Private Sub ChangeImeMode(ByVal handle As IntPtr, ByVal imeMode As ImeMode)
        Dim lngInputContextHandle As IntPtr
        Dim lngStatusIMEConversion As Integer
        Dim lngWin32apiResultCode As Boolean
        lngInputContextHandle = ImmGetContext(handle)
        If lngInputContextHandle <> New IntPtr(0) Then
            lngWin32apiResultCode = ImmSetOpenStatus(lngInputContextHandle, True)
            Select Case imeMode
                Case ImeMode.AlphaFull      '全角英数字
                    lngStatusIMEConversion = IME_CMODE_FULLSHAPE
                Case ImeMode.Hiragana       '全角ひらがな
                    lngStatusIMEConversion = IME_CMODE_NATIVE Or IME_CMODE_FULLSHAPE
                Case ImeMode.Katakana       '全角カナ
                    lngStatusIMEConversion = IME_CMODE_NATIVE Or IME_CMODE_FULLSHAPE Or IME_CMODE_KATAKANA
                Case ImeMode.KatakanaHalf   '半角カナ
                    lngStatusIMEConversion = IME_CMODE_NATIVE Or IME_CMODE_KATAKANA
                Case Else
                    lngWin32apiResultCode = ImmSetOpenStatus(lngInputContextHandle, False)
                    lngWin32apiResultCode = ImmReleaseContext(handle, lngInputContextHandle)
                    Exit Sub
            End Select
            lngWin32apiResultCode = ImmSetConversionStatus(lngInputContextHandle, lngStatusIMEConversion, IME_SMODE_AUTOMATIC)
            lngWin32apiResultCode = ImmReleaseContext(handle, lngInputContextHandle)
        End If
    End Sub
    
===================================================================================    

    上記コードに対し、コントロールにフォーカスがあたったタイミングで
    『ChangeImeMode(Me.Handle, Me.ImeMode)』を渡しています。

    例えばImeModeが半角カナのコントロールにフォーカスをあてたらImeも半角カナに
    変換したいといった流れです。
===================================================================================    

引用返信 編集キー/
■99879 / inTopicNo.2)  Re[1]: VB.netによるIMEの変換について
□投稿者/ KOZ (239回)-(2022/06/15(Wed) 11:37:58)
No99878 (くま さん) に返信
> Windowsの設定 - キーボードの詳細設定 - 『アプリウィンドウごとに異なる入力方式を設定する』にチェックを入れない状態で
> IMEモードを切り替える方法をご教示頂けないでしょうか。

「SetInputScope function (inputscope.h)」
https://docs.microsoft.com/en-us/windows/win32/api/inputscope/nf-inputscope-setinputscope

「InputScope enumeration (inputscope.h)」
https://docs.microsoft.com/en-us/windows/win32/api/inputscope/ne-inputscope-inputscope

以下、参考になりそうな記事です。

「ImmSetConversionStatus (かそれに変わる方法で) をWindows8/10で使いたい」
https://social.msdn.microsoft.com/Forums/windows/ja-JP/405e7da1-c2b8-4057-a568-8a20c33af181/immsetconversionstatus?forum=vcgeneralja

「C# APIを用いてのIME変更」
http://bbs.wankuma.com/index.cgi?mode=al2&namber=81363&KLOG=138

引用返信 編集キー/
■99881 / inTopicNo.3)  Re[2]: VB.netによるIMEの変換について
□投稿者/ KOZ (240回)-(2022/06/15(Wed) 16:21:10)
2022/06/15(Wed) 18:23:17 編集(投稿者)
No99879 (KOZ) に返信

『アプリウィンドウごとに異なる入力方式を設定する』にチェックを入れない状態だと、フォーカスが当たったとき、ImeMode プロパティの値が前のフィールドの状態を引き継ぎます。
SetInputScope で設定した値はフォーカスが当たるたび元に戻るので、1回セットすれば充分です。

TextBox を継承したコントロールを作るなら ImeModeBase プロパティをオーバーライドするといいと思います。

Imports System.Runtime.InteropServices

Public Class TextBoxEx
    Inherits TextBox

    Protected Overrides Property ImeModeBase As ImeMode
        Get
            Return MyBase.ImeModeBase
        End Get
        Set(value As ImeMode)
            MyBase.ImeModeBase = value
            If IsHandleCreated Then
                SetInputScope(Handle, InputScope.IS_DEFAULT)
                SetInputScope(Handle, ToInputScope(value))
            End If
        End Set
    End Property

    Protected Overrides Sub OnHandleCreated(e As EventArgs)
        MyBase.OnHandleCreated(e)
        SetInputScope(Handle, ToInputScope(ImeModeBase))
    End Sub

    Protected Overrides Sub WndProc(ByRef m As Message)
        Select Case m.Msg
            Case WM_DESTROY
                SetInputScope(Handle, InputScope.IS_DEFAULT)
                MyBase.WndProc(m)
            Case Else
                MyBase.WndProc(m)
        End Select
    End Sub

    Private Shared Function ToInputScope(value As ImeMode) As InputScope
        Select Case value
            Case ImeMode.NoControl
                Return InputScope.IS_DEFAULT
            Case ImeMode.[On]
                Return InputScope.IS_HIRAGANA
            Case ImeMode.Disable
                Return InputScope.IS_DEFAULT
            Case ImeMode.Hiragana
                Return InputScope.IS_HIRAGANA
            Case ImeMode.Katakana
                Return InputScope.IS_KATAKANA_FULLWIDTH
            Case ImeMode.KatakanaHalf
                Return InputScope.IS_KATAKANA_HALFWIDTH
            Case ImeMode.AlphaFull
                Return InputScope.IS_ALPHANUMERIC_FULLWIDTH
            Case ImeMode.Alpha
                Return InputScope.IS_ALPHANUMERIC_HALFWIDTH
            Case ImeMode.HangulFull
                Return InputScope.IS_HANGUL_FULLWIDTH
            Case ImeMode.Hangul
                Return InputScope.IS_HANGUL_HALFWIDTH
            Case ImeMode.Close
                Return InputScope.IS_DEFAULT
            Case ImeMode.OnHalf
                Return InputScope.IS_ALPHANUMERIC_HALFWIDTH
        End Select
        Return InputScope.IS_DEFAULT
    End Function

    Private Const WM_DESTROY As Integer = &H2

    <DllImport("Msctf.dll", CharSet:=CharSet.None, ExactSpelling:=False)>
    Private Shared Function SetInputScope(hwnd As IntPtr, scope As InputScope) As IntPtr
    End Function

    Private Enum InputScope
        IS_DEFAULT = 0
        IS_URL = 1
        IS_FILE_FULLFILEPATH = 2
        IS_FILE_FILENAME = 3
        IS_EMAIL_USERNAME = 4
        IS_EMAIL_SMTPEMAILADDRESS = 5
        IS_LOGINNAME = 6
        IS_PERSONALNAME_FULLNAME = 7
        IS_PERSONALNAME_PREFIX = 8
        IS_PERSONALNAME_GIVENNAME = 9
        IS_PERSONALNAME_MIDDLENAME = 10
        IS_PERSONALNAME_SURNAME = 11
        IS_PERSONALNAME_SUFFIX = 12
        IS_ADDRESS_FULLPOSTALADDRESS = 13
        IS_ADDRESS_POSTALCODE = 14
        IS_ADDRESS_STREET = 15
        IS_ADDRESS_STATEORPROVINCE = 16
        IS_ADDRESS_CITY = 17
        IS_ADDRESS_COUNTRYNAME = 18
        IS_ADDRESS_COUNTRYSHORTNAME = 19
        IS_CURRENCY_AMOUNTANDSYMBOL = 20
        IS_CURRENCY_AMOUNT = 21
        IS_DATE_FULLDATE = 22
        IS_DATE_MONTH = 23
        IS_DATE_DAY = 24
        IS_DATE_YEAR = 25
        IS_DATE_MONTHNAME = 26
        IS_DATE_DAYNAME = 27
        IS_DIGITS = 28
        IS_NUMBER = 29
        IS_ONECHAR = 30
        IS_PASSWORD = 31
        IS_TELEPHONE_FULLTELEPHONENUMBER = 32
        IS_TELEPHONE_COUNTRYCODE = 33
        IS_TELEPHONE_AREACODE = 34
        IS_TELEPHONE_LOCALNUMBER = 35
        IS_TIME_FULLTIME = 36
        IS_TIME_HOUR = 37
        IS_TIME_MINORSEC = 38
        IS_NUMBER_FULLWIDTH = 39
        IS_ALPHANUMERIC_HALFWIDTH = 40
        IS_ALPHANUMERIC_FULLWIDTH = 41
        IS_CURRENCY_CHINESE = 42
        IS_BOPOMOFO = 43
        IS_HIRAGANA = 44
        IS_KATAKANA_HALFWIDTH = 45
        IS_KATAKANA_FULLWIDTH = 46
        IS_HANJA = 47
        IS_HANGUL_HALFWIDTH = 48
        IS_HANGUL_FULLWIDTH = 49
        IS_SEARCH = 50
        IS_FORMULA = 51
        IS_SEARCH_INCREMENTAL = 52
        IS_CHINESE_HALFWIDTH = 53
        IS_CHINESE_FULLWIDTH = 54
        IS_NATIVE_SCRIPT = 55
        IS_YOMI = 56
        IS_TEXT = 57
        IS_CHAT = 58
        IS_NAME_OR_PHONENUMBER = 59
        IS_EMAILNAME_OR_ADDRESS = 60
        IS_PRIVATE = 61
        IS_MAPS = 62
        IS_NUMERIC_PASSWORD = 63
        IS_NUMERIC_PIN = 64
        IS_ALPHANUMERIC_PIN = 65
        IS_ALPHANUMERIC_PIN_SET = 66
        IS_FORMULA_NUMBER = 67
        IS_CHAT_WITHOUT_EMOJI = 68
        IS_PHRASELIST = -1
        IS_REGULAREXPRESSION = -2
        IS_SRGS = -3
        IS_XML = -4
        IS_ENUMSTRING = -5
    End Enum

End Class



引用返信 編集キー/
■99886 / inTopicNo.4)  Re[2]: VB.netによるIMEの変換について
□投稿者/ くま (204回)-(2022/06/15(Wed) 18:23:48)
> 以下、参考になりそうな記事です。

多くの参考サイトのご教示、ありがとうございます。
本日は別作業で時間の確保が難しいので明日以降に確認させて頂きます。
引用返信 編集キー/
■99887 / inTopicNo.5)  Re[3]: VB.netによるIMEの変換について
□投稿者/ くま (205回)-(2022/06/15(Wed) 18:27:57)
すみません、返信相手のお名前の記載が漏れていました。

先程の内容もこちらもKOZ様に対してです。

> 『アプリウィンドウごとに異なる入力方式を設定する』にチェックを入れない状態だと、フォーカスが当たったとき、ImeMode プロパティの値が前のフィールドの状態を引き継ぎます。
> SetInputScope で設定した値はフォーカスが当たるたび元に戻るので、1回セットすれば充分です。
>
> TextBox を継承したコントロールを作るなら ImeModeBase プロパティをオーバーライドするといいと思います。


ありがとうございます、また、具体的なコードまで記載頂き本当に助かります。
上に書いた通り本日は検証する時間がとれなそうなので明日以降に確認させて頂きます。
引用返信 編集キー/
■99890 / inTopicNo.6)  Re[3]: VB.netによるIMEの変換について
□投稿者/ くま (206回)-(2022/06/16(Thu) 09:41:19)
あれ?名前同じですね(笑)。
引用返信 編集キー/
■99891 / inTopicNo.7)  Re[1]: VB.netによるIMEの変換について
□投稿者/ KOZ (241回)-(2022/06/16(Thu) 11:55:14)
2022/06/16(Thu) 12:02:18 編集(投稿者)

No99878 (くま さん) に返信
> ・Grapecity Inputmanを使用

あーしまった。
今さらですが、InputMan は GcIme クラスに SetInputScope メソッドを持っています。

https://docs.grapecity.com/help/inputman-winforms-8/GrapeCity.Win.Editors.v80~GrapeCity.Win.Editors.GcIme~SetInputScope.html
https://docs.grapecity.com/help/inputman-winforms-8/GcIme_ImeMode.html

拡張プロパティとして実装できるようですね。
引用返信 編集キー/
■99892 / inTopicNo.8)  Re[4]: VB.netによるIMEの変換について
□投稿者/ くま (207回)-(2022/06/16(Thu) 13:31:20)
No99890 (くま さん) に返信
> あれ?名前同じですね(笑)。
 そうなんです笑 自分はかなり前に(1年以上前?)に『くま』の名前で投稿させて頂いていて、
 久しぶりにこちらを拝見した時にもう一人の『くま』様がいらっしゃって驚きました。
 しかも投稿したタイミングが重なって更に紛らわしくなるという笑
引用返信 編集キー/
■99893 / inTopicNo.9)  Re[2]: VB.netによるIMEの変換について
□投稿者/ くま (208回)-(2022/06/16(Thu) 13:35:40)
No99891 (KOZ さん) に返信
> 2022/06/16(Thu) 12:02:18 編集(投稿者)

> あーしまった。
> 今さらですが、InputMan は GcIme クラスに SetInputScope メソッドを持っています。
追加情報ありがとうございます。
InputManは今回初めて触れたのですが、知らないことだらけなので勉強になります。

ちなみに昨日記載頂いたコードで無事テストが完了し、本日納品させて頂きました。
本当にありがとうございました!

これで本件は解決済とさせて頂きます。
解決済み
引用返信 編集キー/
■99904 / inTopicNo.10)  Re[5]: VB.netによるIMEの変換について
□投稿者/ kiku (267回)-(2022/06/16(Thu) 17:15:40)
No99892 (くま さん) に返信
> ■No99890 (くま さん) に返信
>>あれ?名前同じですね(笑)。
>  そうなんです笑 自分はかなり前に(1年以上前?)に『くま』の名前で投稿させて頂いていて、
>  久しぶりにこちらを拝見した時にもう一人の『くま』様がいらっしゃって驚きました。
>  しかも投稿したタイミングが重なって更に紛らわしくなるという笑

できればどちらか改名を。
例えば漢字の熊にするとか、カタカナのクマにするとか。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -