[[20130122093840]] 『VBAからHTAのウィンドウを閉じる』(スカボロー) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『VBAからHTAのウィンドウを閉じる』(スカボロー)

 おはようございます。

 簡易作業の為にHTAファイルを使用しております。
 VBAを使うまでもないがVBSではリストボックスなどの
 コントロールが使えないのでHTAファイルを使っています。

 使ったらその都度閉じればいいのですが、開いたままの
 HTAウィンドウがいくつも有る、という状態になることが
 あります。単なる無精ですが・・・。

 この開いているHTAウィンドウをHTAの外部から(エクセルVBA)
 から閉じることは可能でしょうか?

 検索したらメモ帳を閉じる方法は見つかりました。
 ↓がそれです。

[[20111208235225]] 『開いているメモ帳の内容に別の文字列を追加して元のメモ帳に反映』(カシスソーダ)

 「WM_CLOSE」を使えばいい、というところまではわかりましたが、
 これをHTAに応用するにはどう書き換えたらいいかがわかりません。

 ヒントでもよろしいですのでご教示いただきましたら幸いです。
 よろしくお願いいたします。

 閉じるというよりも、二重起動しないようにしたほうが良い気がしますが、
 閉じるのであれば、Window を閉じのではありませんが、プロセスを削除で
 同等の処理になると思います。
 すべての hta を削除してよければ、Shell で下記を実行
 taskkill /IM mshta.exe
 でどうでしょうか。
 (Mook)

 Mookさん、ご回答ありがとうございます。

 >Shell で下記を実行
 > taskkill /IM mshta.exe

 下記のコードでうまく作動しました。

 Sub htacls()
  Dim sKillhta As String
   sKillhta = "taskkill /IM mshta.exe"
   Shell sKillhta, vbHide
 End Sub

 ありがとうございました。
 (スカボロー)

 たびたび失礼します。

 ↓でもいけました。

 Sub htacls2()
  Dim myexe As String
  Dim wProcess As Object
   myexe = "mshta.exe"
   For Each wProcess In GetObject("winmgmts:root\cimv2").ExecQuery("select * from Win32_Process where Name='" & myexe & "'")
    wProcess.Terminate
   Next wProcess
 End Sub

 いずれのコードもHTAでは問題ないですが、ワード(WinWord.exe)を指定した場合は
 前回終了させたドキュメントを次回起動した時に修復するか聞いてきます。
 また、エクセルを終了させようとした場合は当然ですがフリーズしました。
 他のアプリケーションも場合によっては不具合が出る場合があるかもしれませんの
 で、このページを見てコードを試す場合は注意が必要かもしれません。

 (スカボロー)

 ご自身で気付かれていたので良かったですが、TaskKill はアプリケーションを問答無用で
 強制終了させるものなので、ファイルを処理したり保存したりするタイプのアプリケーション
 には不向きです。

 そのような場合はお行儀よく、Window 制御イベントで保存、終了をコントロールする方が
 良いでしょうね。

 ProcessID は WMI でも取得できますし、WScript.Shell の Exec メソッドでは ProcessID
 プロパティが使用できるので、起動も含めて処理する場合は、そちらの方が良いかもしれ
 ません。
 同名のアプリケーションが複数ある場合は、WMI のクエリだけでは特定が面倒なので。
 (Mook)

 Mookさん、再度のご回答ありがとうございます。

 >そのような場合はお行儀よく、Window 制御イベントで保存、終了をコントロールする方が
 >良いでしょうね。

 ほとんど手付かずの状態ですがAPIも勉強したら便利そうです。
 ありがとうございました。

 (スカボロー)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.