Excel VBA質問箱 IV

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

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


2601 / 13646 ツリー ←次へ | 前へ→

【66940】IME入力モードの制御 いったく 10/10/19(火) 18:18 質問[未読]
【66941】Re:IME入力モードの制御 通り魔 10/10/19(火) 19:44 発言[未読]
【66944】Re:IME入力モードの制御 通り魔 10/10/19(火) 20:26 発言[未読]
【66954】Re:IME入力モードの制御 いったく 10/10/21(木) 11:46 質問[未読]
【66955】Re:IME入力モードの制御 neptune 10/10/21(木) 12:07 発言[未読]
【66962】Re:IME入力モードの制御 いったく 10/10/21(木) 15:19 発言[未読]
【66969】Re:IME入力モードの制御 neptune 10/10/21(木) 21:59 発言[未読]

【66940】IME入力モードの制御
質問  いったく  - 10/10/19(火) 18:18 -

引用なし
パスワード
   Excel上に配置したコマンドボタンを押して別ウィンドゥ(アプリケーション)の
IMEを無条件にオフにしたいと思い、ネット上のVBAサンプルプログラムを
見よう見まねで記述したのですが、期待どおりに動きません。
どこが悪いのか、ご存知の方がいたらご指摘いただけないでしょうか?
Excel2000を使用しています。
私が記述したVBAは以下のとおりです。
***************************************************************************
Private Declare Function GetForegroundWindow Lib "user32" () As Long
Private Declare Function GetNextWindow Lib "user32" Alias "GetWindow" (ByVal hWnd As Long, ByVal wFlag As Long) As Long
Private Declare Function ImmSetOpenStatus Lib "imm32.dll" (ByVal himc As Long, ByVal b As Long) As Long

Private Sub Command1_Click()
  Dim himc As Long
  Dim myhWnd As Long
  
  myhWnd = GetForegroundWindow()
  myhWnd = GetNextWindow(myhWnd, 2)
  
  Application.WindowState = xlMinimized

  Call ImmSetOpenStatus(myhWnd, False)
  Application.WindowState = xlMinimized

End Sub
***************************************************************************

よろしくお願いします


【66941】Re:IME入力モードの制御
発言  通り魔  - 10/10/19(火) 19:44 -

引用なし
パスワード
   ▼いったく さん:

そのAPIはよく知らないのですが、
ひょっとするとウィンドウハンドルじゃなくてデバイスコンテキストのハンドルが
必要なのかもしれません。

【66944】Re:IME入力モードの制御
発言  通り魔  - 10/10/19(火) 20:26 -

引用なし
パスワード
   ▼いったく さん:

たびたびすいませんデバイスコンテキストじゃなくて普通のコンテキストでした

VBですがここが参考になると思われます
ht tp://www.alato.ne.jp/kazu-/vb/tip09.htm


Private Declare Function GetForegroundWindow Lib "user32" () As Long
Private Declare Function GetNextWindow Lib "user32" Alias "GetWindow" (ByVal hWnd As Long, ByVal wFlag As Long) As Long
Private Declare Function ImmSetOpenStatus Lib "imm32.dll" (ByVal himc As Long, ByVal b As Long) As Long
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 Sub Command1_Click()
  Dim himc As Long
  Dim myhWnd As Long
  
  myhWnd = GetForegroundWindow()
  myhWnd = GetNextWindow(myhWnd, 2)
  
  
  himc = ImmGetContext(myhWnd)
  
 
  Application.WindowState = xlMinimized

  Call ImmSetOpenStatus(himc, False)


  Application.WindowState = xlMinimized
  
  '取得したコンテキストハンドルは必ずリリースする
  Call ImmReleaseContext(myhWnd, himc)
  
End Sub

【66954】Re:IME入力モードの制御
質問  いったく  - 10/10/21(木) 11:46 -

引用なし
パスワード
   ▼通り魔 さん:
回答ありがとうございます。
また返信が遅くなり申し訳ありません。

ご教授いただいたように訂正して実行してみたのですが、
IMEモードがオフにはなりませんでした。

他に何か原因があるのでしょうか?

・WindowsXP、Office2000
・Windows7、Office2007
いずれでも同様でした。

>▼いったく さん:
>
>たびたびすいませんデバイスコンテキストじゃなくて普通のコンテキストでした
>
>VBですがここが参考になると思われます
>ht tp://www.alato.ne.jp/kazu-/vb/tip09.htm
>
>
>Private Declare Function GetForegroundWindow Lib "user32" () As Long
>Private Declare Function GetNextWindow Lib "user32" Alias "GetWindow" (ByVal hWnd As Long, ByVal wFlag As Long) As Long
>Private Declare Function ImmSetOpenStatus Lib "imm32.dll" (ByVal himc As Long, ByVal b As Long) As Long
>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 Sub Command1_Click()
>  Dim himc As Long
>  Dim myhWnd As Long
>  
>  myhWnd = GetForegroundWindow()
>  myhWnd = GetNextWindow(myhWnd, 2)
>  
>  
>  himc = ImmGetContext(myhWnd)
>  
> 
>  Application.WindowState = xlMinimized
>
>  Call ImmSetOpenStatus(himc, False)
>
>
>  Application.WindowState = xlMinimized
>  
>  '取得したコンテキストハンドルは必ずリリースする
>  Call ImmReleaseContext(myhWnd, himc)
>  
>End Sub

【66955】Re:IME入力モードの制御
発言  neptune  - 10/10/21(木) 12:07 -

引用なし
パスワード
   ▼いったく さん:
横入り失礼。気になる所だけですけど、

気になる所を言うと、  
>>  myhWnd = GetForegroundWindow()
>>  myhWnd = GetNextWindow(myhWnd, 2)
getnextwindowでHWNDを取得してますが、本当にそのforegrandwindow の次の
windowで良いのですか?普通windowsアプリって沢山のwindowで構成されて
いますから。

どんなアプリか知りませんけど、windowって沢山ありますから。
正確にwindowを取得できてますかって事です。
例えば、親ウィンドウにIMEの指定をしてもその子windowにまで
影響したのかどうかまで覚えていませんけど、そのように作りこまれて
ないアプリでは、駄目なような気がします。

又、フォーカスが外れた時にもどのような状態になるかもそのアプリが
どう作られているかによると思いますので、結構鬱陶しそう。

多分
>ご教授いただいたように訂正して実行してみたのですが、
>IMEモードがオフにはなりませんでした。

>他に何か原因があるのでしょうか?

>・WindowsXP、Office2000
>・Windows7、Office2007
>いずれでも同様でした。
の情報だけでは原因は誰にもわからないと思います。

【66962】Re:IME入力モードの制御
発言  いったく  - 10/10/21(木) 15:19 -

引用なし
パスワード
   ▼neptune さん:
ご指摘ありがとうございます。

具体的には、エクセル上のデータを「sendkeys」によって
基幹システムの入力エリアへ自動貼り付けを行おうと思いました。
その際基幹側の入力が全角モードになっていると貼り付けが正しく
行われないので、入力モードを制御しようと考えた次第です。

Windowのハンドリングや制御もよくわからず、見よう見まねなので
前提条件として2つのWindowは並べて置くことにしようと思い、
記述したコーディングになりました。

ほかの手段がないか、検討したいと思います。

>▼いったく さん:
>横入り失礼。気になる所だけですけど、
>
>気になる所を言うと、  
>>>  myhWnd = GetForegroundWindow()
>>>  myhWnd = GetNextWindow(myhWnd, 2)
>getnextwindowでHWNDを取得してますが、本当にそのforegrandwindow の次の
>windowで良いのですか?普通windowsアプリって沢山のwindowで構成されて
>いますから。
>
>どんなアプリか知りませんけど、windowって沢山ありますから。
>正確にwindowを取得できてますかって事です。
>例えば、親ウィンドウにIMEの指定をしてもその子windowにまで
>影響したのかどうかまで覚えていませんけど、そのように作りこまれて
>ないアプリでは、駄目なような気がします。
>
>又、フォーカスが外れた時にもどのような状態になるかもそのアプリが
>どう作られているかによると思いますので、結構鬱陶しそう。
>
>多分
>>ご教授いただいたように訂正して実行してみたのですが、
>>IMEモードがオフにはなりませんでした。
>
>>他に何か原因があるのでしょうか?
>
>>・WindowsXP、Office2000
>>・Windows7、Office2007
>>いずれでも同様でした。
>の情報だけでは原因は誰にもわからないと思います。

【66969】Re:IME入力モードの制御
発言  neptune  - 10/10/21(木) 21:59 -

引用なし
パスワード
   ▼いったく さん:

>具体的には、エクセル上のデータを「sendkeys」によって
>基幹システムの入力エリアへ自動貼り付けを行おうと思いました。
>その際基幹側の入力が全角モードになっていると貼り付けが正しく
>行われないので、入力モードを制御しようと考えた次第です。
理由は「sendkeys 不具合」でググってみるとわかりますが、業務で使うので
あればsendkeysの使用は避けた方が賢明です。
また、恐らくsendkeysを使うからIME制御も必要になっているんだと思います。

>ほかの手段がないか、検討したいと思います。
手法としては正しいwindowのHWNDを取得、それに対して、IME制御やtext設定
を行うという事になると思います。
パッと思いつく方法としては、
・spy++(入手困難),winspector(フリーソフト)等でそのwindowのクラス名を取得、
クラス名と位置関係等を取得して、そのwindowを確定する
(IDから取得できるかもしれませんがVBからはやった事ないので出来るかどうか判らない)
・必要ならIME制御(たぶんsendmessageなら不要と思う)。
・sendmessageで WM_SETTEXT を送りテキストを変更する
という手順になろうかと思います。

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