DOBON.NET DOBON.NETプログラミング掲示板過去ログ

プロセスの終了

分類:[VB6以前]

はじめまして、うたです。

タスクマネージャーのプロセスの終了ってあると思うんですが
あんな感じの事がVBで行いたいんですが
他のプロセスを終了する方法を教えてください。

以上
■No1011に返信(うたさんの記事)
> はじめまして、うたです。
>
> タスクマネージャーのプロセスの終了ってあると思うんですが
> あんな感じの事がVBで行いたいんですが
> 他のプロセスを終了する方法を教えてください。
>
> 以上

他のプロセスを終了は、ウィンドウハンドルを取得し、ウィンドウハンドル
を元に削除する方法があります。

Public Declare Function FindWindow Lib "USER32" Alias "FindWindowA" (ByVal _
lpClassName As String, ByVal lpWindowName As String) As Long


Public Declare Function PostMessage Lib "USER32" Alias "PostMessageA" _
(ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam _
As Long) As Long
Public Const WM_QUIT = &H12


Public Function gfm_lngKillProcess(ByVal pi_strTitle As String) As Long
'RET  0:削除対象なし
'   1:削除成功
'マイナス:削除失敗
Dim lngHandle As Long

On Error GoTo LBL_ERR_FUNCTION

'ウィンドウのハンドルを取得
lngHandle = FindWindow(vbNullString, pi_strTitle)
If lngHandle = 0 Then
'起動されていない
gfm_lngKillProcess = 0
Exit Function
Else
'削除実行
Call PostMessage(lngHandle, WM_QUIT, 0, 0)
gfm_lngKillProcess = 1
End If

Exit Function

LBL_ERR_FUNCTION:

'削除エラー
gfm_lngKillProcess = Err.Number

End Function

アプリケーションの一覧を取得するのであれば、EnumWindowsを使いますが
コールバックしなきゃいけないので。。。
下記返信ありがとうございます。うたです。
タスクマネージャーのイメージなのでウィンドウがないので
FindWindowで取得できませんでした。。。
プロセスしか残ってなくともFindWindowできる方法などありますか?

以上
> 他のプロセスを終了は、ウィンドウハンドルを取得し、ウィンドウハンドル
> を元に削除する方法があります。
>
> Public Declare Function FindWindow Lib "USER32" Alias "FindWindowA" (ByVal _
> lpClassName As String, ByVal lpWindowName As String) As Long
>
>
> Public Declare Function PostMessage Lib "USER32" Alias "PostMessageA" _
> (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam _
> As Long) As Long
> Public Const WM_QUIT = &H12
>
>
> Public Function gfm_lngKillProcess(ByVal pi_strTitle As String) As Long
> 'RET  0:削除対象なし
> '   1:削除成功
> 'マイナス:削除失敗
> Dim lngHandle As Long
>
> On Error GoTo LBL_ERR_FUNCTION
>
> 'ウィンドウのハンドルを取得
> lngHandle = FindWindow(vbNullString, pi_strTitle)
> If lngHandle = 0 Then
> '起動されていない
> gfm_lngKillProcess = 0
> Exit Function
> Else
> '削除実行
> Call PostMessage(lngHandle, WM_QUIT, 0, 0)
> gfm_lngKillProcess = 1
> End If
>
> Exit Function
>
> LBL_ERR_FUNCTION:
>
> '削除エラー
> gfm_lngKillProcess = Err.Number
>
> End Function
>
> アプリケーションの一覧を取得するのであれば、EnumWindowsを使いますが
> コールバックしなきゃいけないので。。。
>
2003/10/22(Wed) 00:50:53 編集(投稿者)

■No1023に返信(うたさんの記事)
> 下記返信ありがとうございます。うたです。
> タスクマネージャーのイメージなのでウィンドウがないので
> FindWindowで取得できませんでした。。。
> プロセスしか残ってなくともFindWindowできる方法などありますか?

ProcessクラスのGetProcessById、GetProcesses、GetProcessesByNameメソッドあたりで、
Processクラスのインスタンスを取得し、このインスタンスのKillメソッドを呼ぶというのでどうでしょう?

あるいは、WMIで「Win32_Process」を使うという手もあるかと思います。
http://www.gdncom.jp/general/bbs/ShowPost.aspx?PostID=2751

[追記・補足] 「VB6以前」という目印は最初に見ていたのですが、
すっかり頭から抜け落ちていて、.NETでの方法を回答してしまいましたm(_ _)m
WMIを使う方法に関しては一応VB6以前でも使えるはずです。
■No1023に返信(うたさんの記事)
> 下記返信ありがとうございます。うたです。
> タスクマネージャーのイメージなのでウィンドウがないので
> FindWindowで取得できませんでした。。。
> プロセスしか残ってなくともFindWindowできる方法などありますか?
>
> 以上

ちょっと今時間がなくて調べられないのだけど、プロセスIDとプロセスハンドル
を取得する方法が分かれば、TerminateProcess とCloseHandle を使用して
削除できるかもしれません。
見つけたサンプルです。
http://hp.vector.co.jp/authors/VA015367/vbsamp.htm
  • 題名: Re[4]: プロセスの終了
  • 著者: うた
  • 日時: 2003/10/21 11:14:49
  • ID: 1030
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
返信ありがとうございます。
下記アドレスを参照したところ
上のほうに.net Freamworkと記述されていましたが
インストール済みが前提になりますよね?
それはちょっと避けたいのですが・・・。
そうなると無理ですかね?

> ProcessクラスのGetProcessById、GetProcesses、GetProcessesByNameメソッドあたりで、
> Processクラスのインスタンスを取得し、このインスタンスのKillメソッドを呼ぶというのでどうでしょう?
>
> あるいは、WMIで「Win32_Process」を使うという手もあるかと思います。
> http://www.gdncom.jp/general/bbs/ShowPost.aspx?PostID=2751
>
返信ありがとうございます。うたです。

下記アドレスではShellもしくはCreateProcessを行っていますが
私の場合はやりません。どうすれば良いでしょう・・・。
そこでとりあえずTerminateProcessでプロセスは終了できるかテストしたところ
TerminateProcessの第1引数にタスクマネージャーに表示されているPIDを指定し
行った所、終了しませんでした。。。なぜでしょうか?
> ちょっと今時間がなくて調べられないのだけど、プロセスIDとプロセスハンドル
> を取得する方法が分かれば、TerminateProcess とCloseHandle を使用して
> 削除できるかもしれません。
> 見つけたサンプルです。
> http://hp.vector.co.jp/authors/VA015367/vbsamp.htm
  • 題名: Re[5]: プロセスの終了
  • 著者: うた
  • 日時: 2003/10/21 13:39:35
  • ID: 1035
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
自レスです。

OpenProcessを使用し,第1引数をPROCESS_TERMINATEで行ったところ
TerminateProcessでプロセスを終了することが出来ました。

いろいろとありがとうございました。
> 返信ありがとうございます。うたです。
>
> 下記アドレスではShellもしくはCreateProcessを行っていますが
> 私の場合はやりません。どうすれば良いでしょう・・・。
> そこでとりあえずTerminateProcessでプロセスは終了できるかテストしたところ
> TerminateProcessの第1引数にタスクマネージャーに表示されているPIDを指定し
> 行った所、終了しませんでした。。。なぜでしょうか?
>>ちょっと今時間がなくて調べられないのだけど、プロセスIDとプロセスハンドル
>>を取得する方法が分かれば、TerminateProcess とCloseHandle を使用して
>>削除できるかもしれません。
>>見つけたサンプルです。
>>http://hp.vector.co.jp/authors/VA015367/vbsamp.htm
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板