如何用VB检查程序是否运行?
例如检查QQ.exe是否运行。
VB 检查进程
答案:4 悬赏:0 手机版
解决时间 2021-03-08 12:00
- 提问者网友:棒棒糖
- 2021-03-07 13:44
最佳答案
- 五星知识达人网友:几近狂妄
- 2021-03-07 15:09
调用方法:
if checkexeisrun("VB6.EXE") then msgbox "存在"
'检查进程是否运行,exeName 参数是要检查的进程 exe 名字,比如 VB6.EXE
Private Function CheckExeIsRun(exeName As String) As Boolean
On Error GoTo Err
Dim WMI
Dim Obj
Dim Objs
CheckExeIsRun = False
Set WMI = GetObject("WinMgmts:")
Set Objs = WMI.InstancesOf("Win32_Process")
For Each Obj In Objs
If (InStr(UCase(exeName), UCase(Obj.Description)) <> 0) Then
CheckExeIsRun = True
If Not Objs Is Nothing Then Set Objs = Nothing
If Not WMI Is Nothing Then Set WMI = Nothing
Exit Function
End If
Next
If Not Objs Is Nothing Then Set Objs = Nothing
If Not WMI Is Nothing Then Set WMI = Nothing
Exit Function
Err:
If Not Objs Is Nothing Then Set Objs = Nothing
If Not WMI Is Nothing Then Set WMI = Nothing
End Function
if checkexeisrun("VB6.EXE") then msgbox "存在"
'检查进程是否运行,exeName 参数是要检查的进程 exe 名字,比如 VB6.EXE
Private Function CheckExeIsRun(exeName As String) As Boolean
On Error GoTo Err
Dim WMI
Dim Obj
Dim Objs
CheckExeIsRun = False
Set WMI = GetObject("WinMgmts:")
Set Objs = WMI.InstancesOf("Win32_Process")
For Each Obj In Objs
If (InStr(UCase(exeName), UCase(Obj.Description)) <> 0) Then
CheckExeIsRun = True
If Not Objs Is Nothing Then Set Objs = Nothing
If Not WMI Is Nothing Then Set WMI = Nothing
Exit Function
End If
Next
If Not Objs Is Nothing Then Set Objs = Nothing
If Not WMI Is Nothing Then Set WMI = Nothing
Exit Function
Err:
If Not Objs Is Nothing Then Set Objs = Nothing
If Not WMI Is Nothing Then Set WMI = Nothing
End Function
全部回答
- 1楼网友:空山清雨
- 2021-03-07 18:47
这个太简单了(还是我回答过的)
枚举系统进程:
代码如下:
在属性窗口设置texe1的属性: Text1.MultiLine = True ,Text1.ScrollBars = 3
Const TH32CS_SNAPHEAPLIST = &H1
Const TH32CS_SNAPPROCESS = &H2
Const TH32CS_SNAPTHREAD = &H4
Const TH32CS_SNAPMODULE = &H8
Const TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST Or TH32CS_SNAPPROCESS Or TH32CS_SNAPTHREAD Or TH32CS_SNAPMODULE)
Const MAX_PATH As Integer = 260
Private 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 * MAX_PATH
End Type
Private Declare Function CreateToolhelp32Snapshot Lib "Kernel32" (ByVal lFlags As Long, ByVal lProcessID As Long) As Long
Private Declare Function Process32First Lib "Kernel32" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
Private Declare Function Process32Next Lib "Kernel32" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
Private Declare Sub CloseHandle Lib "Kernel32" (ByVal hPass As Long)
Private Sub Form_Load()
Dim aa As String
aa = Chr(13) + Chr(10)
Dim hSnapShot As Long, uProcess As PROCESSENTRY32
hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0&)
'得到系统中所有正在运行的进程的快照信息
uProcess.dwSize = Len(uProcess)
r = Process32First(hSnapShot, uProcess)
'窗体重画
Do While r
Text1.Text = Text1.Text + Left$(uProcess.szExeFile, IIf(InStr(1, uProcess.szExeFile, Chr$(0)) > 0, InStr(1, uProcess.szExeFile, Chr$(0)) - 1, 0)) + aa
'输出进程到窗体
r = Process32Next(hSnapShot, uProcess)
Loop
CloseHandle hSnapShot
'关闭
End Sub
OK ,搞定,快给我红旗!
- 2楼网友:旧脸谱
- 2021-03-07 18:13
private sub form_load()
if app.previnstance then
end
end if
end sub
用dde实现窗体防止运行多个实例并传递命令
上网的朋友一定都用过网络蚂蚁(net ants)的吧?不知你在使用过程中有没有注意过,那就是如果你想调动两个“蚂蚁”为您效力是不可能的——它总会把新运行的关闭。这点在vb中很容易实现:
private sub form_load()
if app.previnstance then
msgbox "你已经运行这个应用程序了"
end ' 退出新运行的程序
end if
end sub
这样如果你运行这个程序后在运行它,它会弹出一个消息框并拒绝再次运行。这非常容易。 而“蚂蚁”程序的妙处就在于:在重复运行“蚂蚁”时它不仅拒绝运行,而且能把已经运行的“蚂蚁”激活,这样用上面的程序就无能为力了。但事实上实现拒绝运行并激活已运行的
程序有多种方法:
1、用findwindow函数得到已经运行窗体的句柄(hwnd),然后用setactivewindow等api函数将其激活。其缺点也很明显,那就是没法传递参数。
2、用findwindow函数得到已运行窗体的句柄后用sendmessage的方法给窗体传送一个自定义消息(附带参数),然后在窗体中拦截并进行处理,但这样做要修改窗体的标准消息处理程序,用在vc,bc或delphi编写的程序中还行,但在vb中工作量太大,并且容易发生“一般保护行错误”使vb崩溃,不太可取(当然,如果你有足够的信心和不怕崩溃的精神,也可以试一下 ^_^ )。
3、使用dde技术。
所谓dde技术,就是动态数据交换技术。也许你很奇怪,这与本文所讨论的内容有什么相干的?
且听我慢慢讲来。
为了实现拒绝运行并把已经运行的程序激活并实现各种功能,我们可以先用本文开头提到的方法,检测一下程序有没有被运行过,如果没有,就正常运行,如果已经被运行过,就打通与它的dde通道,传给它一个(或一些)数据,然后由已经运行的程序对数据进行处理,再去实现各种“意想不到”的功能,这时也许就有人对这你的程序喊:“酷、酷……” ^_^
好了,耳听为虚,眼见为实,下面让我们动点真格的。
打开vb,新建一个工程,选择菜单中的“工程->工程1 属性”,把工程名称改为“p1”(我爱偷懒,能短则短 ^_^ ),把已有的一个窗体的“linktopic”属性改为“formdde”,把“linkmode”属性改为“1 - source”,添加一个picturebox控件作为dde执行控件,命名为picdde。然后添加一个textbox控件,命名为“txtinfo”,并把“multiline”属性设置为“true”,以便显示多行文本,作为消息显示控件。
最后在窗体代码区输入以下代码:
const commandline = "commandline=" ' 还是为了省事,定义一个常量
private sub form_linkexecute(cmdstr as string, cancel as integer)
static lngcount as long
dim info as string
info = txtinfo.text ' 保留原有信息
select case cmdstr ' cmdstr 是dde程序传送过来的参数
case "max"
me.windowstate = 2
info = info + vbnewline + "窗体已被最大化"
case "showtime"
info = info + vbnewline + "最后一次运行这个程序的时间是:" + str(now)
case "count"
lngcount = lngcount + 1
info = info + vbnewline + "你已经第" + str(lngcount) + "次重复调用这个程序。" _
+ vbnewline + "但怕您不多给工资,所以只运行了一个 ^_^"
end select
if left(cmdstr, len(commandline)) = commandline then
info = info + vbnewline + "新程序曾以命令行形式运行" + vbnewline + "命令行为:" _
+ vbnewline + right(cmdstr, len(cmdstr) - len(commandline))
end if
txtinfo.text = info ' 把信息显示出来
cancel = false
end sub
private sub linkandsendmessage(byval msg as string)
dim t as long
picdde.linkmode = 0 '--
picdde.linktopic = "p1|formdde" ' |______连接dde程序并发送数据/参数
picdde.linkmode = 2 ' | “|”为管道符,是“退格键”旁边的竖线,
picdde.linkexecute msg '-- 不是字母或数字!
t = picdde.linktimeout '--
picdde.linktimeout = 1 ' |______终止dde通道。当然,也可以用别的方法
picdde.linkmode = 0 ' | 这里用的是超时强制终止的方法
picdde.linktimeout = t '--
end sub
private sub form_load()
if app.previnstance then ' 程序是否已经运行
me.linktopic = "" ' 这两行用于清除新运行的程序的dde服务器属性,
me.linkmode = 0 ' 否则在连接dde程序时会出乱子的
linkandsendmessage "max" '--
linkandsendmessage "count" ' |-----连接dde接受程序并传送数据/参数
linkandsendmessage "showtime" '--
if command <> "" then ' 如果有命令行参数,就传递过去
linkandsendmessage commandline + command
end if
end ' 结束新程序的运行
end if
end sub
测试一下:
把工程“p1”编译成exe文件(设名称为 p1.exe )
1、打开“我的电脑”,找到 p1.exe 并执行。可以看到程序正常运行了。
2、再运行一次,这次新程序没有运行成功,而原来运行的程序却被最大化了,而且文本框中有以下
字符:
窗体已被最大化
你已经第 1次重复调用这个程序。
但怕您不多给工资,所以只运行了一个 ^_^
最后一次运行这个程序的时间是:00-2-6 7:11:01
3、打开 ms-dos方式 ,用命令行方式再次运行程序,如 “p1 how are you?”
这时原来运行的程序文本框中又多了几行字:
窗体已被最大化
你已经第 2次重复调用这个程序。
但怕您不多给工资,所以只运行了一个 ^_^
最后一次运行这个程序的时间是:00-2-6 7:14:32
新程序曾以命令行形式运行
命令行为:
how are you?
ok,运行完全正确,然后你就可以把它应用的你的程序中了。
- 3楼网友:行路难
- 2021-03-07 16:40
新建一个模块:
Const TH32CS_SNAPHEAPLIST = &H1
Const TH32CS_SNAPPROCESS = &H2
Const TH32CS_SNAPTHREAD = &H4
Const TH32CS_SNAPMODULE = &H8
Const TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST Or TH32CS_SNAPPROCESS Or TH32CS_SNAPTHREAD Or TH32CS_SNAPMODULE)
Const TH32CS_INHERIT = &H80000000
Const MAX_PATH As Integer = 260
Private 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 * MAX_PATH
End Type
Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal lFlags As Long, ByVal lProcessID As Long) As Long
Private Declare Function Process32First Lib "kernel32" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
Private Declare Function Process32Next Lib "kernel32" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
Private Declare Sub ExitProcess Lib "kernel32" (ByVal uExitCode As Long)
Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long
Function exitproc(ByVal exefile As String) As Boolean
exitproc = False
Dim hSnapShot As Long, uProcess As PROCESSENTRY32
hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0&)
uProcess.dwSize = Len(uProcess)
r = Process32First(hSnapShot, uProcess)
Do While r
If Left$(uProcess.szExeFile, IIf(InStr(1, uProcess.szExeFile, Chr$(0)) > 0, InStr(1, uProcess.szExeFile, Chr$(0)) - 1, 0)) = exefile Then
exitproc = True
Exit Do
End If
r = Process32Next(hSnapShot, uProcess)
Loop
End Function
窗体直接调用
示例如下:
Private Sub Form_Load()
If exitproc("QQ.exe")=True Then '检测QQ.exe进程是否存在
MsgBox "存在!"
Else
MsgBox "不存在!"
End If
End Sub
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯