[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『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.