没找到,郁闷.估计又是个不结帖的~~~~那我再贴一次吧:以下代码复制到一个新建的标准模块里并保存为ModFindProcess.bas:'************************************************************************* '**模 块 名:ModFindProcess '**说 明:进程相关操作 '**创 建 人:马大哈 http://www.m5home.com/ '**日 期:2006年3月18日 '**日 期:2007年1月23日 '**描 述:改进了结束进程的条件,可以根据PID来结束 '**版 本:V1.3 '************************************************************************* Option ExplicitPrivate Declare Function ProcessFirst Lib "kernel32" Alias "Process32First" (ByVal hSnapshot As Long, uProcess As PROCESSENTRY32) As Long Private Declare Function ProcessNext Lib "kernel32" Alias "Process32Next" (ByVal hSnapshot As Long, uProcess As PROCESSENTRY32) As Long Private Declare Function CreateToolhelpSnapshot Lib "kernel32" Alias "CreateToolhelp32Snapshot" (ByVal lFlags As Long, lProcessID As Long) As Long Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As LongPrivate Const FORMAT_MESSAGE_ALLOCATE_BUFFER = &H100 Private Const FORMAT_MESSAGE_FROM_SYSTEM = &H1000 Private Const TH32CS_SNAPPROCESS As Long = 2& Private Const PROCESS_TERMINATE = 1Private Type PROCESSENTRY32 dwSize As Long cntUsage As Long th32ProcessID As Long th32DefaultHeapID As Long th32ModuleID As Long cntThreads As Long th32ParentProcessID As Long pcPriClassBase As Long dwFlags As Long szexeFile As String * 260 End TypePrivate Type MyProcess ExeName As String PID As Long End TypePublic Function CloseProcess(Optional ByVal ProName As String, Optional ByVal PID As Long) As Integer '传入进程名或PID,结束相应进程 Dim tPID As Long Dim tPHwnd As Long Dim ProArr() As String, PIDArr() As Long Dim I As Long
Call ListProcess(ProArr, PIDArr) For I = 1 To UBound(ProArr) If PIDArr(I) = PID Or ProArr(I) = ProName Then '配对进程ID或进程名 Exit For End If Next I
If I > UBound(PIDArr) Then Exit Function tPID = PIDArr(I)
tPHwnd = OpenProcess(PROCESS_TERMINATE, False, tPID) Debug.Print tPHwnd If tPHwnd Then CloseProcess = TerminateProcess(tPHwnd, 0) End If End FunctionPublic Function FindProcess(ByVal ProName As String, Optional ByRef PID As Long) As Boolean '传入进程名,如果进程存在,在PID里返回进程ID,函数返回True,否则返回Flase 'ProName: 指定进程名 'PID: 如果进程名存在,返回其PID '返回值: 进程名存在返回TRUE,否则返回FALSE Dim ProArr() As String, PIDArr() As Long Dim I As Long
Call ListProcess(ProArr, PIDArr) For I = 1 To UBound(ProArr) If ProArr(I) = ProName Then PID = PIDArr(I) FindProcess = True Exit For End If Next I End FunctionPublic Function ListProcess(ByRef ProExeName() As String, ByRef ProPid() As Long) '列出进程以及相应PID 'ProExeName(): 进程名 'ProPid(): 相应的PID Dim MyProcess As PROCESSENTRY32 Dim mySnapshot As Long Dim ProData() As MyProcess Dim I As Long
For I = 1 To UBound(ProData) With ProData(I) ProExeName(I) = .ExeName ProPid(I) = .PID End With Next I End Function 使用很简单,如下:If FindProcess("qq.exe") = True Then MsgBox "qq.exe存在!结束之." CloseProcess "qq.exe" End If以上代码仅是测试用,小心点啊哈哈,记得改文件名为其它,如记事本之类...不然QQ消失了可别怪我没说:)
Declare Function SetComputerName Lib "kernel32" Alias "SetComputerNameA" (ByVal lpComputerName As String) As Long 这里的Declare Function SetComputerName 是声明一个函数名为 SetComputerName的函数 而 Lib "kernel32" Alias "SetComputerNameA"是说直接调用kernel32(即C:\WINDOWS\SYSTEM32\kernel32.DLL)中的SetComputerNameA函数。 知道了没。意思就是说老马的那一句:Private Declare Function ProcessFirst Lib "kernel32" Alias "Process32First" (ByVal hSnapshot As Long, uProcess As PROCESSENTRY32) As Long就声明了一个函数 叫ProcessFirst
哦~你好象没太懂我的意思。我是说要ProcessFirst这个函数的帮助文档。给个连接
你到www.msdn.com上搜一下不就知道了吗?
'例如你是监测 QQ 的运行, 便自动终止进程 (当然你也可以用窗口标题来查找exe名称或句柄)'添加 Command1Option Explicit Dim procname$, rtn&, Tmpstr$ Dim objWMIService, colProcessList, objProcessPrivate Sub Command1_Click() procname = "qq.exe" Tmpstr = "." Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & Tmpstr & "\root\cimv2") Set colProcessList = objWMIService.ExecQuery("Select * from Win32_Process Where Name = '" & procname & "'") If colProcessList.Count > 0 Then For Each objProcess In colProcessList rtn = MsgBox("您确定要终止 " & procname & " 吗?", vbYesNo, "强制关闭进程") If rtn = 6 Then objProcess.Terminate Next End If End Sub
不需要句柄结束进程的那不是API,而是用Shell运行的一个外部程序,Windows自带
可以得到帮助。
tskill也存在~不过帮助内容不相同。
'**模 块 名:ModFindProcess
'**说 明:进程相关操作
'**创 建 人:马大哈 http://www.m5home.com/
'**日 期:2006年3月18日
'**日 期:2007年1月23日
'**描 述:改进了结束进程的条件,可以根据PID来结束
'**版 本:V1.3
'*************************************************************************
Option ExplicitPrivate Declare Function ProcessFirst Lib "kernel32" Alias "Process32First" (ByVal hSnapshot As Long, uProcess As PROCESSENTRY32) As Long
Private Declare Function ProcessNext Lib "kernel32" Alias "Process32Next" (ByVal hSnapshot As Long, uProcess As PROCESSENTRY32) As Long
Private Declare Function CreateToolhelpSnapshot Lib "kernel32" Alias "CreateToolhelp32Snapshot" (ByVal lFlags As Long, lProcessID As Long) As Long
Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As LongPrivate Const FORMAT_MESSAGE_ALLOCATE_BUFFER = &H100
Private Const FORMAT_MESSAGE_FROM_SYSTEM = &H1000
Private Const TH32CS_SNAPPROCESS As Long = 2&
Private Const PROCESS_TERMINATE = 1Private Type PROCESSENTRY32
dwSize As Long
cntUsage As Long
th32ProcessID As Long
th32DefaultHeapID As Long
th32ModuleID As Long
cntThreads As Long
th32ParentProcessID As Long
pcPriClassBase As Long
dwFlags As Long
szexeFile As String * 260
End TypePrivate Type MyProcess
ExeName As String
PID As Long
End TypePublic Function CloseProcess(Optional ByVal ProName As String, Optional ByVal PID As Long) As Integer
'传入进程名或PID,结束相应进程
Dim tPID As Long
Dim tPHwnd As Long
Dim ProArr() As String, PIDArr() As Long
Dim I As Long
Call ListProcess(ProArr, PIDArr)
For I = 1 To UBound(ProArr)
If PIDArr(I) = PID Or ProArr(I) = ProName Then '配对进程ID或进程名
Exit For
End If
Next I
If I > UBound(PIDArr) Then Exit Function
tPID = PIDArr(I)
tPHwnd = OpenProcess(PROCESS_TERMINATE, False, tPID)
Debug.Print tPHwnd
If tPHwnd Then
CloseProcess = TerminateProcess(tPHwnd, 0)
End If
End FunctionPublic Function FindProcess(ByVal ProName As String, Optional ByRef PID As Long) As Boolean
'传入进程名,如果进程存在,在PID里返回进程ID,函数返回True,否则返回Flase
'ProName: 指定进程名
'PID: 如果进程名存在,返回其PID
'返回值: 进程名存在返回TRUE,否则返回FALSE
Dim ProArr() As String, PIDArr() As Long
Dim I As Long
Call ListProcess(ProArr, PIDArr)
For I = 1 To UBound(ProArr)
If ProArr(I) = ProName Then
PID = PIDArr(I)
FindProcess = True
Exit For
End If
Next I
End FunctionPublic Function ListProcess(ByRef ProExeName() As String, ByRef ProPid() As Long)
'列出进程以及相应PID
'ProExeName(): 进程名
'ProPid(): 相应的PID
Dim MyProcess As PROCESSENTRY32
Dim mySnapshot As Long
Dim ProData() As MyProcess
Dim I As Long
ReDim ProData(0)
MyProcess.dwSize = Len(MyProcess)
mySnapshot = CreateToolhelpSnapshot(TH32CS_SNAPPROCESS, 0&)
ProcessFirst mySnapshot, MyProcess
ReDim Preserve ProData(UBound(ProData) + 1)
ProData(UBound(ProData)).ExeName = Left(MyProcess.szexeFile, InStr(MyProcess.szexeFile, Chr(0)) - 1)
ProData(UBound(ProData)).PID = MyProcess.th32ProcessID
'Debug.Print ProData(UBound(ProData)).ExeName
MyProcess.szexeFile = ""
While ProcessNext(mySnapshot, MyProcess)
ReDim Preserve ProData(UBound(ProData) + 1)
ProData(UBound(ProData)).ExeName = Left(MyProcess.szexeFile, InStr(MyProcess.szexeFile, Chr(0)) - 1)
ProData(UBound(ProData)).PID = MyProcess.th32ProcessID
' Debug.Print ProData(UBound(ProData)).ExeName
MyProcess.szexeFile = ""
Wend
ReDim ProExeName(UBound(ProData))
ReDim ProPid(UBound(ProData))
For I = 1 To UBound(ProData)
With ProData(I)
ProExeName(I) = .ExeName
ProPid(I) = .PID
End With
Next I
End Function
使用很简单,如下:If FindProcess("qq.exe") = True Then
MsgBox "qq.exe存在!结束之."
CloseProcess "qq.exe"
End If以上代码仅是测试用,小心点啊哈哈,记得改文件名为其它,如记事本之类...不然QQ消失了可别怪我没说:)
我看我还是用“OpenProcess”加“TerminateProcess”两个API搞定算了。
多谢各位了!!!
我的MSDN是6。0的,怎么没那个ProcessFirst函数?还有用VB声明API的加在工具也没这个函数,能告诉我在哪有这个函数的说明么?
这里的Declare Function SetComputerName 是声明一个函数名为 SetComputerName的函数
而 Lib "kernel32" Alias "SetComputerNameA"是说直接调用kernel32(即C:\WINDOWS\SYSTEM32\kernel32.DLL)中的SetComputerNameA函数。
知道了没。意思就是说老马的那一句:Private Declare Function ProcessFirst Lib "kernel32" Alias "Process32First" (ByVal hSnapshot As Long, uProcess As PROCESSENTRY32) As Long就声明了一个函数 叫ProcessFirst
Dim procname$, rtn&, Tmpstr$
Dim objWMIService, colProcessList, objProcessPrivate Sub Command1_Click()
procname = "qq.exe"
Tmpstr = "."
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & Tmpstr & "\root\cimv2")
Set colProcessList = objWMIService.ExecQuery("Select * from Win32_Process Where Name = '" & procname & "'")
If colProcessList.Count > 0 Then
For Each objProcess In colProcessList
rtn = MsgBox("您确定要终止 " & procname & " 吗?", vbYesNo, "强制关闭进程")
If rtn = 6 Then objProcess.Terminate
Next
End If
End Sub
给你一个简单的吧,XP系统ok
都是一个很高的要求啊