プロが教える店舗&オフィスのセキュリティ対策術

アクティブウインドウのIMEコンテキスト取得を取得したい。

以下、問題のコードです。

---ここから

'アクティブウインドウのハンドルを取得API宣言
Private Declare Function GetActiveWindow Lib "user32" () As Long

'IMEコンテキスト取得API宣言
Private Declare Function ImmGetContext Lib "imm32.dll" _
(ByVal hWnd As Long) As Long

Private Sub CommandButton1_Click()

'アクティブウインドウのハンドルを取得
Dim hWnd As Long
hWnd = GetActiveWindow()

'IMEコンテキスト取得
Dim himc As Long
himc = ImmGetContext(hWnd)

End Sub

---ここまで

上記のコードでアクティブウインドウ(上記例の場合、エクセル)でのIMEコンテキスト取得
したいと思っています。

hWndでは、ハンドルを取得できているのですが、

himcの戻り値が0になってしまって、IMEコンテキスト取得が失敗しています。

目的は、アクティブウインドウでのIMEの入力をローマジ入力の半角英数のみにすることです。

そのため、IMEコンテキスト取得を取得したいのですが、上記方法のどこがいけないでしょうか?

どうぞよろしくお願いします。

言語:VBA(Excel 2007)
OS:Vista

A 回答 (2件)

セルに対する入力制限なら入力規則で IME をコントロールできるけど?

この回答への補足

サンプルプログラムとは違いますが、たとえば、メモ帳に対して、VBAからSendkeysで半角英数のみの文字を送りたいという使い方をしたいのです。どのようにすれば可能でしょうか?なお、VBAのSendkeysは日本語を通すのはチェック済みです。よろしくお願いします。

補足日時:2010/05/27 22:01
    • good
    • 0

hWnd = GetActiveWindow()



で取得できるのは、Excel の一番外枠のウィンドウのハンドルですが、このウィンドウには入力フォーカスはありませんので

himc = ImmGetContext(hWnd)

が 0 になるのだと思います。
今、手元には Excel 2000 の環境しかないのですが、Excel 2000 では

hWnd = GetActiveWindow()

のウィンドウの子ウィンドウの中にクラス名が XLDESK のウィンドウがあり、
さらにその子ウィンドウにクラス名が EXCEL7 ( Excel 2007 では EXCEL10 ? ) で、
ウィンドウキャプションがブック名のウィンドウがあり、このウィンドウに対して

himc = ImmGetContext(hWnd)

を実行すると 0 でない値が取得できました。
GetWindow() や FindWindowEx() を使用すると目的のウィンドウのハンドルを取得できると思います。(再帰的に検索しなければならないかも)
    • good
    • 0
この回答へのお礼

なるほど。入力できる子ウインドウを見つければよいのですね。GetWindow() で試してみましたが、どうもうまくいきませんでした。しかし、ハンドルの取得の仕方は他にもあるようです。いろいろ試してみたいと思います。ご回答ありがとうございました。

お礼日時:2010/05/28 04:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!