Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


5577 / 13645 ツリー ←次へ | 前へ→

【50046】IMEパッドのソフトキーボードを表示したい kobasan 07/7/5(木) 22:37 質問[未読]
【50055】Re:IMEパッドのソフトキーボードを表示した... neptune 07/7/6(金) 9:55 発言[未読]
【50059】Re:IMEパッドのソフトキーボードを表示した... neptune 07/7/6(金) 13:54 発言[未読]
【50066】Re:IMEパッドのソフトキーボードを表示した... kobasan 07/7/6(金) 22:04 発言[未読]
【50067】Re:IMEパッドのソフトキーボードを表示した... kobasan 07/7/7(土) 0:21 発言[未読]
【50069】Re:IMEパッドのソフトキーボードを表示した... neptune 07/7/7(土) 10:36 発言[未読]
【50071】Re:IMEパッドのソフトキーボードを表示した... kobasan 07/7/7(土) 18:21 お礼[未読]
【50073】Re:IMEパッドのソフトキーボードを表示した... neptune 07/7/7(土) 19:42 発言[未読]

【50046】IMEパッドのソフトキーボードを表示したい
質問  kobasan  - 07/7/5(木) 22:37 -

引用なし
パスワード
   IMEパッドのソフトキーボードをマクロで表示したいのですが。
スクリーンキーボードなら
  Shell ("osk.exe")
で表示できるのですが、
ソフトキーボードの場合、このようなexeファイルがあるのでしょうか。

【50055】Re:IMEパッドのソフトキーボードを表示し...
発言  neptune  - 07/7/6(金) 9:55 -

引用なし
パスワード
   ▼kobasan さん:
こんにちは

>IMEパッドのソフトキーボードをマクロで表示したいのですが。
>スクリーンキーボードなら
>  Shell ("osk.exe")
>で表示できるのですが、
これ、新発見です。こんなのあるんですね?

>ソフトキーボードの場合、このようなexeファイルがあるのでしょうか。
質問の回答というわけではないのですが

ソフトキーボードはIMEの機能の1つですから、APIを使用した時のものです。
※VB6で確認しましたが、多分同じと思います。
 HWNDの取得だけ変更してみて下さい。
Private Declare Function ImmGetContext Lib "imm32.dll" _
  (ByVal hWnd As Long) As Long
Private Declare Function ImmReleaseContext Lib "imm32.dll" _
  (ByVal hWnd As Long, _
  ByVal hImc As Long) As Long
Private Declare Function ImmSetConversionStatus Lib "imm32.dll" _
  (ByVal hImc As Long, _
  ByVal dw1 As Long, _
  ByVal dw2 As Long) As Long
Private Const IME_CMODE_SOFTKBD = &H80        'ソフトキーボードモード
Private Const IME_SMODE_AUTOMATIC = &H4

Private Sub Command2_Click()
Dim IMC As Long
Dim lngResult As Long
dim lhWnd as long

  'ここはExcelのHWND、UserFormのHWNDなどでOKと思います。
  lhWnd = Me.Text1.hWnd
  IMC = ImmGetContext(lhWnd )
  lngResult = ImmSetConversionStatus(IMC, IME_CMODE_SOFTKBD, IME_SMODE_AUTOMATIC)
  ImmReleaseContext lhWnd , IMC
End Sub

【50059】Re:IMEパッドのソフトキーボードを表示し...
発言  neptune  - 07/7/6(金) 13:54 -

引用なし
パスワード
   ▼kobasan さん:
Excelで動くのが出来ました。
シート上にフォームのボタンを作って、IMETestを割り当てて実行してみて下さい。

Option Explicit

Public Declare Function ImmGetContext Lib "imm32.dll" _
  (ByVal hWnd As Long) As Long
Public Declare Function ImmReleaseContext Lib "imm32.dll" _
  (ByVal hWnd As Long, _
  ByVal hIMC 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
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
  (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function ImmSetOpenStatus Lib "imm32.dll" _
  (ByVal hIMC As Long, ByVal b As Long) As Long
Public Declare Function ImmGetOpenStatus Lib "imm32" _
  (ByVal hIMC As Long) As Long
  
Public Const IME_CMODE_SOFTKBD = &H80     'ソフトキーボードモード
Public Const IME_SMODE_AUTOMATIC = &H4

'IMEモード定数
Public Const IME_CMODE_OFF = &H0&
Public Const IME_CMODE_NATIVE = &H1&

Public Const XLCLASS As String = "XLMAIN"


Sub IMETest()
Dim IMC As Long
Dim lngResult As Long
Dim lhWnd As Long

  'ここはExcelのHWNDを取得。
  lhWnd = FindWindow(XLCLASS, CStr(Application.Caption))
  Debug.Print lhWnd
  IMC = ImmGetContext(lhWnd)
'  IMEがOffならOnにする。
  If ImmGetOpenStatus(IMC) = IME_CMODE_OFF Then
    Call ImmSetOpenStatus(IMC, IME_CMODE_NATIVE)
  End If
  lngResult = ImmSetConversionStatus(IMC, IME_CMODE_SOFTKBD, IME_SMODE_AUTOMATIC)
  ImmReleaseContext lhWnd, IMC
End Sub

多分大丈夫と思いますが。。。。、実は先ほどUPしたものを再度確認していたら
動かなかったので、削除して、訂正したものです。

【50066】Re:IMEパッドのソフトキーボードを表示し...
発言  kobasan  - 07/7/6(金) 22:04 -

引用なし
パスワード
   ▼neptune さん 今晩は。
回答うありがとうございます。

当方のマシン環境 XP Excel20022
IMEをMicrosoftのMicrosoft IME Standard 2002 ver.8.1に設定しています。

今のところ、提示のコードを試しているのですが、「ソフトキーボード」を表示してくれません。
それで、

homepage2.nifty.com/Mr_XRAY/Delphi/plSamples/T_SoftKeyboard.htm
(上記にh t t p : / /を付加してください)

のホームページのDelphi5のコードと見比べながら、検討中です。とりあえず報告しておきます。

【50067】Re:IMEパッドのソフトキーボードを表示し...
発言  kobasan  - 07/7/7(土) 0:21 -

引用なし
パスワード
   neptune さん 今晩は。
Meマシン IME 2000 7.1.0 では、neptune さんの提示のコードで表示できました。
XPマシンの方はまだ表示できません。XPの方も表示できるようもう少し検討してみます。

【50069】Re:IMEパッドのソフトキーボードを表示し...
発言  neptune  - 07/7/7(土) 10:36 -

引用なし
パスワード
   ▼kobasan さん:
>neptune さん 今晩は。
>XPマシンの方はまだ表示できません。XPの方も表示できるようもう少し検討してみます。

こんにちは

なんででですかね?
私の環境は
Win XP SP2 最新UpData済み
Office 2K SP3
MS IME Standard 2002 ver8.1
です。これで検証しました。

neptune - 07/7/6(金) 13:54 のソースは
標準モジュールに作成、シート上にフォームのコマンドボタンを貼り付け
それにIMETestを割りあて、その後、フォームのコマンドボタンをクリック
して実行しました。

Officeのバージョンですが、kobasanさんと、バージョンは違いますが、
APIのみの操作ですから、関係ないと思います。
クラス名も97以降はXLMAINで正解です。
//support.microsoft.com/kb/288902/ja

使用APIも恐らくIME98以降では実装されていると思います。

重要
neptune - 07/7/6(金) 9:55 -
のソースですが、
> 'ここはExcelのHWND、UserFormのHWNDなどでOKと思います。
と書いていますが、これはガセかもしれません。m(_ _)m
UserFormはIMEのハンドルを持つことが出来るかどうか調べていません。
もしかしたら、UserFormのハンドルを使用していると駄目かもしれません。
ごめんなさい。

【50071】Re:IMEパッドのソフトキーボードを表示し...
お礼  kobasan  - 07/7/7(土) 18:21 -

引用なし
パスワード
   ▼neptune さん 今日は。
サンプルコードの提示と色々と検討してくださりありがとうございます。

>>XPマシンの方はまだ表示できません。XPの方も表示できるようもう少し検討してみます。

>なんででですかね?
>私の環境は
>Win XP SP2 最新UpData済み
>Office 2K SP3
>MS IME Standard 2002 ver8.1
>です。これで検証しました。

私の環境は
Win XP SP2 Office 2002 MS IME Standard 2002 ver8.1
です。で、いまだにXPでは表示できません。(エラーなしで終了し、日本語入力モードになるだけです。)
ただ、私の場合ATOK 2005も入っています。このソフトキーボードを使うときは
MS IME Standard 2002 ver8.1
に切り替えています。
(切り替えているように見えるだけかも。neptuneさんは検証されているので、このような心配が、今はあります。私の力では推測するくらいがせいぜいです。)
Meマシンでは同様に切り替えてやると、ソフトキーボードを表示できます。

それと、先に挙げた
homepage2.nifty.com/Mr_XRAY/Delphi/plSamples/T_SoftKeyboard.htm
のホームページに
/=============================================
// IMEパッド - ソフトキーボードを表示
// ただし,IMEがMicrosoftの場合のみ有効
// [例]Microsoft IME Standard 2002 ver.8.1等
//============================================
とあるので、前述の心配(IMEがMicrosoftでないかも)がわくのかもしれません。

こればかりに時間がかけられないので、しばらく寝かせておこうと思っています。
とりあえず、お礼マークをつけさせてください。

neptune さん 貴重な時間を使ってくださり、本当にありがとうございます。

何かいい方法がありましたら、また、どなたか教えてください。

【50073】Re:IMEパッドのソフトキーボードを表示し...
発言  neptune  - 07/7/7(土) 19:42 -

引用なし
パスワード
   ▼kobasan さん:
こんにちは

>で、いまだにXPでは表示できません。(エラーなしで終了し、日本語入力モードになるだけです。)
え〜実は私も↑に悩みました。で、加えた変更が、
>'  IMEがOffならOnにする。
>  If ImmGetOpenStatus(IMC) = IME_CMODE_OFF Then
>    Call ImmSetOpenStatus(IMC, IME_CMODE_NATIVE)
>  End If
です。
IMEを切り替えた後、

lRet:Long型
lRet=ImmGetOpenStatus(IMC) = IME_CMODE_OFF
IME が開いていれば 0 以外の値が返り、それ以外の場合は 0 が返ります。

lRet=ImmSetOpenStatus(IMC, IME_CMODE_NATIVE)
関数が成功すると、0 以外の値が返ります。
関数が失敗すると、0 が返ります。

で、戻り値を確認して見てはどうですか?

それとIMEの切り替えに多少の時間は要らないんですかね???
>こればかりに時間がかけられないので、しばらく寝かせておこうと思っています。
>とりあえず、お礼マークをつけさせてください。
了解、頑張ってくださいませ。

5577 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free