Excel VBA:IMEがONかOFFかを調べる|Windows APIを使用します

アプリ単位でIMEがONかOFFかを調べるVBAを掲載しています。



Homeに戻る > Excel プログラムのTipsへ

IMEの設定はアプリ単位で異なるため、ここではExcelのIMEの状態を取得します。

ユーザーフォームなどへ入力する前のチェックに使用できるかと思います。

アプリ単位で調べる必要があるので、下記の複数のAPIを使用します。

FindWindow関数とは

  • ウィンドウのタイトルからウィンドウのハンドルを取得します。
  • 構文: Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
  • 戻り値:成功するとウィンドウのハンドルが返り、失敗するとNULLが返ります。
  • lpClassName:(省略不可)ウィンドウのクラス名を指定します。Excelの場合は「XLMAIN」になります。
  • lpWindowName:ウィンドウのタイトルバーを指定します。

ImmGetContext関数とは

  • ウィンドウに関連付けられている入力コンテキストを取得します。 入力コンテキストとは、現在の入力の状態を格納した変数のようなものです。
  • 構文: Declare Function ImmGetContext Lib "imm32.dll" (ByVal hwnd As Long) As Long
  • 戻り値:入力コンテキストが返ります。 hwnd:取得するウィンドウハンドルを指定します。

ImmGetOpenStatus関数とは

  • IMEが開いているかどうかを調べます。
  • 構文: Declare Function ImmGetOpenStatus Lib "imm32.dll" (ByVal hImc As Long) As Long
  • 戻り値:IMEが開いていれば0以外の値が、それ以外の場合は0が返ります。
  • hImc:入力コンテキストを指定します。

ImmReleaseContext関数とは

  • 入力コンテキストを解放し、コンテキスト内の関連メモリのロックを解除します。
  • 構文: Declare Function ImmReleaseContext Lib "imm32.dll" (ByVal hwnd As Long, ByVal hImc As Long) As Long
  • 戻り値:成功すると0以外の値が、失敗すると0 が返ります。
  • hwnd:ImmGetContextを実行した時のウィンドウハンドルを指定します。
  • hImc:入力コンテキストを指定します。

関連する記事として「テキストボックスのIME入力モードを変更する」を掲載していますので参照してください。




IMEがONかOFFかを調べるVBA

VBAの解説

  1. APIのImmGetContext関数を宣言
  2. APIのImmGetOpenStatus関数を宣言
  3. APIのImmReleaseContext関数を宣言
  4. APIのFindWindow関数を宣言
■ コマンドボタンクリックイベント
  1. B10セルに移動します。
  2. DoEventsでセルの移動完了まで待ちます。
  3. FindWindow関数で、アプリのウィンドウハンドルを取得します。
  4. ImmGetContext関数で、ウィンドウに関連付けられている入力コンテキストを取得します。
  5. ImmGetOpenStatus関数で、IMEが開いているかどうかを取得します。
  6. ImmReleaseContext関数で、入力コンテキストを解放し、コンテキスト内の関連メモリのロックを解除します。
  7. ImmGetOpenStatus関数の戻り値が0ならばB10セルに「OFF」と表示、0以外ならば「ON」と表示します。

Excel VBA コード

Option Explicit

'指定されたウィンドウに関連付けられている入力コンテキストを取得
Private Declare Function ImmGetContext Lib "imm32.dll" (ByVal hwnd As Long) As Long
'IMEが開いているかどうかを調べる
Private Declare Function ImmGetOpenStatus Lib "imm32.dll" (ByVal hImc As Long) As Long
'入力コンテキストを解放し、コンテキスト内の関連メモリのロックを解除
Private Declare Function ImmReleaseContext Lib "imm32.dll" (ByVal hwnd As Long, ByVal hImc As Long) As Long
'指定された文字列と一致するクラス名とウィンドウ名を持つウィンドウハンドルを取得
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" _
    (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Private Sub CommandButton1_Click()
    Dim hImc As Long
    Dim ret As Long
    Dim hwnd As Long
    
    Range("B10").Activate
    DoEvents
    'エクセルのウィンドウハンドルを取得
    hwnd = FindWindow("XLMAIN", Application.Caption)
    
    hImc = ImmGetContext(hwnd)
    'IMEが開いているかどうかを調べる
    ret = ImmGetOpenStatus(hImc)
    ImmReleaseContext hwnd, hImc
    '結果を表示
    If ret = 0 Then
        Range("B10") = "OFF"
    Else
        Range("B10") = "ON"
    End If
    
End Sub



Excel VBA 実行結果

コマンドボタンをクリックすると、B10セルに結果(ON又は、OFF)が表示されています。


Homeに戻る > Excel プログラムのTipsへ

■■■
このサイトの内容を利用して発生した、いかなる問題にも一切責任は負いませんのでご了承下さい
■■■
当ホームページに掲載されているあらゆる内容の無許可転載・転用を禁止します


Copyright (c) Excel-Excel ! All rights reserved