[リストへもどる]
一括表示

投稿時間:2003/12/25(Thu) 15:32
投稿者名:わたなべ
Eメール:
URL :
タイトル:
アプリケーションの終了
はじめまして、わたなべともうします。

  当方、NT4.0環境にてVB4.0を使用し
  Windows上で起動しているアプリケーションの
  終了を行おうとしております。
  タスクマネージャのアプリケーションタブで
  できることがやりたいのですが、現在
  アプリケーション?は終了できるのですが
  プロセスが残る状態でいきづまっております。

  こちらにあるサンプル001を実行すると
  同じ状況なのですが、何か解決策があれば
  ご教授いただきたく

  再現方法
   1.電卓起動
   2.タスクマネージャを起動
   3サンプル001を起動
   4.FORMよりキャプション名を与えてなになにに
     電卓を入力
   5.処理選択終了するを選択後、実行ボタンクリック
   6.タスクマネージャアプリケーションタブ上より
     電卓は終了するが、プロセスタブ上にCALC.exeが
     残る

                          −以上−

投稿時間:2003/12/25(Thu) 18:39
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: アプリケーションの終了
回答ではありませんが、この現象は「電卓」だけではないでしょうか?
他のアプリも同様でしょうか?
windows98 では、電卓ではなりますが、メモ帳やExcelでは確認できませんが
電卓の内部構造のせいではないでしょうか?タスクマネージャから終了させても
同様の動作となります。

電卓に限って言えば、APIのTerminateProcessを使って強制終了する方法もあります。

投稿時間:2003/12/25(Thu) 22:50
投稿者名:わたなべ
Eメール:
URL :
タイトル:
Re^2: アプリケーションの終了
こんばんは、わたなべです。

> 回答ではありませんが、この現象は「電卓」だけではないでしょうか?
> 他のアプリも同様でしょうか?
  ちと、こちらの終了したいアプリでも現象がでてます。

> 電卓に限って言えば、APIのTerminateProcessを使って強制終了する方法もあります。
  こちらも、TerminateProcessでの終了を試みているのですが
  私自身のスキル不足の問題で終了できずにいます。
  サンプルプログラムの洋にタスクマネージャのアプリケーション
  一覧っぽく表示した状態でTerminateProcessを使用する方法と
  いうか、ハンドルの取得方法がわからなくて・・・・

                      

投稿時間:2003/12/26(Fri) 00:44
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^3: アプリケーションの終了
>   一覧っぽく表示した状態でTerminateProcessを使用する方法と
>   いうか、ハンドルの取得方法がわからなくて・・・・

こちらは、そのものズバリで「ウィンドウの列挙」でWEBで検索すればサンプルが
見つかりますが!・・・・・

http://www.geocities.co.jp/SiliconValley/4805/vbtips/vbtips078.htm

投稿時間:2003/12/26(Fri) 13:35
投稿者名:わたなべ
Eメール:
URL :
タイトル:
Re^4: アプリケーションの終了
わたなべです。

  VB4.0では、コールバック関数?てのが使えないらしく
  GetWindowってので、起動しているアプリ名とハンドルを
  取得しています。
  で、取得したアプリを順番に殺して行く感じ
  キャプション名?からハンドル名を取得してPostMessageだと殺せる
  のですが
       Dim handle_id  As Long
       handle_id = FindWindow(vbNullString, キャプション名)
       PostMessage = PostMessageW(handle_id, WM_CLOSE, 0, 0)


  TerminateProcessを使用すると殺せません
       Dim handle_id  As Long
       handle_id = FindWindow(vbNullString, キャプション名)
       Call TerminateProcess(handle_id, 0&)
       Call CloseHandle(handle_id)


  おそらく、なんか勘違いしてるのだとは思うのですが
  お気づきの点があれば、お教えいただきたく

投稿時間:2003/12/26(Fri) 13:45
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^5: アプリケーションの終了
>   TerminateProcessを使用すると殺せません
>        Dim handle_id  As Long
>        handle_id = FindWindow(vbNullString, キャプション名)
>        Call TerminateProcess(handle_id, 0&)
>        Call CloseHandle(handle_id)

下記ではどうですか?

        'クラス名より、ウィンドウのハンドルを取得(電卓の場合)
        hWindow = FindWindowEx(0, 0, "SciCalc", vbNullString)
        'プロセスIDを取得
        Call GetWindowThreadProcessId(hWindow, ProcessID)
        'プロセスオブジェクトのハンドルを取得
        hProcess = OpenProcess(PROCESS_ALL_ACCESS, True, ProcessID)
        'プロセスを強制終了する
        Call TerminateProcess(hProcess, 0&)
        'オブジェクトのハンドルを開放
        Call CloseHandle(hProcess)

URLのサンプルではコールバック関数を使用していますが、別に使用せずとも同様に一覧を取得
出来ますよ。

投稿時間:2003/12/26(Fri) 19:37
投稿者名:わたなべ
Eメール:
URL :
タイトル:
Re^6: アプリケーションの終了
わたなべです。
> 下記ではどうですか?

  できました!
GetWindowThreadProcessId(hWindow, ProcessID)
  がミソでした。
  プロセスIDさえわかれば私でも殺し方がわかるんで
  助かりました。

  GetWindowで取得したハンドルと
  ハンドルからプロセスIDもとめて
  OpenProcessする場合との違いは
  なんなのでしょうか?

 
  それにしても、いやはや、ありがとうございました
  これで、年末休めます。(よいおとしをぉ〜)

                         −以上−