用vb写了一个程序,生成可执行文件aaa.exe,运行后其标题为bbb。
现要写另一个程序,检测上面那个程序是否正在运行,目的:当上面的那个程序自动退出后重启该程序
(为什么要这样,别问)
请问能实现吗?怎么实现?感谢!
现要写另一个程序,检测上面那个程序是否正在运行,目的:当上面的那个程序自动退出后重启该程序
(为什么要这样,别问)
请问能实现吗?怎么实现?感谢!
解决方案 »
- 关于VB代码的效率问题,请高手和权威人士回答。
- 新手请教简单的编程问题!——在线等ing
- 急迫阿!!!!关于图片的
- vb6中照片显示问题
- selection.find.execute如何得知整篇文档已经找完了?
- 三个月自学到找工作的水平,可能吗?有高分送!
- 求救! 请问那里有visual basic 6.0 英文企业版或者是专业版下载????
- 阴差阳错,被录取到北大信息管理与信息系统专业,有谁知道第一年学习的主要内容是什么吗?
- 那位高手帮我做个毕设(销售管理系统)
- VB如何调用SQL Server7.0?
- 如何实现在图片上面创建不同的点击按钮?
- 在VB的FORM中,怎样显示WEB页呀???请兄弟姐妹们帮帮呀,谢谢了。
Public Declare Function Process32First Lib "kernel32" ( _
ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As Long
Public Declare Function Process32Next Lib "kernel32" ( _
ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As Long
Public Declare Function CloseHandle Lib "Kernel32.dll" _
(ByVal Handle As Long) As Long
Public Declare Function OpenProcess Lib "Kernel32.dll" _
(ByVal dwDesiredAccessas As Long, ByVal bInheritHandle As Long, _
ByVal dwProcId As Long) As Long
Public Declare Function EnumProcesses Lib "psapi.dll" _
(ByRef lpidProcess As Long, ByVal cb As Long, _
ByRef cbNeeded As Long) As Long
Public Declare Function GetModuleFileNameExA Lib "psapi.dll" _
(ByVal hProcess As Long, ByVal hModule As Long, _
ByVal ModuleName As String, ByVal nSize As Long) As Long
Public Declare Function EnumProcessModules Lib "psapi.dll" _
(ByVal hProcess As Long, ByRef lphModule As Long, _
ByVal cb As Long, ByRef cbNeeded As Long) As Long
Public Declare Function CreateToolhelp32Snapshot Lib "kernel32" ( _
ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long
Public Declare Function GetVersionExA Lib "kernel32" _
(lpVersionInformation As OSVERSIONINFO) As Integer
Public Type PROCESSENTRY32
dwSize As Long
cntUsage As Long
th32ProcessID As Long ' This process
th32DefaultHeapID As Long
th32ModuleID As Long ' Associated exe
cntThreads As Long
th32ParentProcessID As Long ' This process's parent process
pcPriClassBase As Long ' Base priority of process threads
dwFlags As Long
szExeFile As String * 260 ' MAX_PATH
End Type
Public Type OSVERSIONINFO
dwOSVersionInfoSize As Long
dwMajorVersion As Long
dwMinorVersion As Long
dwBuildNumber As Long
dwPlatformId As Long '1 = Windows 95.
'2 = Windows NT
szCSDVersion As String * 128
End Type
Public Const PROCESS_QUERY_INFORMATION = 1024
Public Const PROCESS_VM_READ = 16
Public Const MAX_PATH = 260
Public Const STANDARD_RIGHTS_REQUIRED = &HF0000
Public Const SYNCHRONIZE = &H100000
'STANDARD_RIGHTS_REQUIRED Or SYNCHRONIZE Or &HFFF
Public Const PROCESS_ALL_ACCESS = &H1F0FFF
Public Const TH32CS_SNAPPROCESS = &H2&
Public Const hNull = 0 Function StrZToStr(s As String) As String
StrZToStr = Left$(s, Len(s) - 1)
End Function Public Function getVersion() As Long
Dim osinfo As OSVERSIONINFO
Dim retvalue As Integer
osinfo.dwOSVersionInfoSize = 148
osinfo.szCSDVersion = Space$(128)
retvalue = GetVersionExA(osinfo)
getVersion = osinfo.dwPlatformId
End Function窗体:一个listbox,一个按钮
Option ExplicitPrivate Sub Command1_Click()
List1.Clear
Select Case getVersion()Case 1 'Windows 95/98 Dim f As Long, sname As String
Dim hSnap As Long, proc As PROCESSENTRY32
hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
If hSnap = hNull Then Exit Sub
proc.dwSize = Len(proc)
' Iterate through the processes
f = Process32First(hSnap, proc)
Do While f
sname = StrZToStr(proc.szExeFile)
List1.AddItem sname
f = Process32Next(hSnap, proc)
LoopCase 2 'Windows NT Dim cb As Long
Dim cbNeeded As Long
Dim NumElements As Long
Dim ProcessIDs() As Long
Dim cbNeeded2 As Long
Dim NumElements2 As Long
Dim Modules(1 To 200) As Long
Dim lRet As Long
Dim ModuleName As String
Dim nSize As Long
Dim hProcess As Long
Dim i As Long
'Get the array containing the process id's for each process object
cb = 8
cbNeeded = 96
Do While cb <= cbNeeded
cb = cb * 2
ReDim ProcessIDs(cb / 4) As Long
lRet = EnumProcesses(ProcessIDs(1), cb, cbNeeded)
Loop
NumElements = cbNeeded / 4 For i = 1 To NumElements
'Get a handle to the Process
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION _
Or PROCESS_VM_READ, 0, ProcessIDs(i))
'Got a Process handle
If hProcess <> 0 Then
'Get an array of the module handles for the specified
'process
lRet = EnumProcessModules(hProcess, Modules(1), 200, _
cbNeeded2)
'If the Module Array is retrieved, Get the ModuleFileName
If lRet <> 0 Then
ModuleName = Space(MAX_PATH)
nSize = 500
lRet = GetModuleFileNameExA(hProcess, Modules(1), _
ModuleName, nSize)
List1.AddItem Left(ModuleName, lRet)
End If
End If
'Close the handle to the process
lRet = CloseHandle(hProcess)
NextEnd Select
MsgBox IsRun("C:\WINDOWS\rUNDLL32.EXE")
End SubPrivate Function IsRun(ByVal filename As String) As Boolean
Dim i As Long
IsRun = False
For i = 1 To List1.ListCount
Debug.Print List1.List(i)
If List1.List(i) = UCase(filename) Then
IsRun = True
Exit Function
End If
NextEnd Function
Dim I As Long
I = FindWindow(vbNullString, "bbb") '查找指定程序
If I <> 0 Then END '如果有運行則關閉本程序
End Sub
谢!
Private Function CanDelete_V2(ByVal FQFilename$) As Boolean
'看一个文件能否删除。能返回 true ,否返回false
'注意这个函数不会删除文件
' 第 2版解决第 1 版与 word 的冲突问题
On Error GoTo handler:
Dim fn As Long
fn = FreeFile '取得一个合法文件号
Open FQFilename For Output Access Write As #fn '试着用写的方式打开文件,如果出错则说明文件是不可删的
Close #fn '关闭文件
CanDelete_V2 = True ' 说明文件可删
Exit Function
handler:
CanDelete_V2 = False '如果出错则说明文件是不可删的
End Function
我自己在外面也刚看到一种方法,大家研究研究:
(不过我自己觉得等待程序结束再响应,在任务管理器上显示“未响应”,这样好吗?
还是没有影响呢?)------------------------------------
Shell & Wait 的程序怎么写?
希望某一 VB 程序利用 Shell 执行某一个外部程序(假设是 notepad.exe)之后,就一直等到此一程序结束执行时, 才回到 VB 程序继续执行, 该怎么办到呢?当我们调用 Shell 时, 会传回一个数值, 此一数值称为 Process Id, 利用此一 Process Id, 我们可以调用 OpenProcess API 取得 Process Handle, 然后再利用 Process Handle 调用 WaitForSingleObject, 即可等待被 Shell 执行
的
程序执行完毕, 才继续向下执行。细节如下:
1. API 的声明:
Const SYNCHRONIZE = &H100000
Const INFINITE = &HFFFFFFFF
Private Declare Function OpenProcess Lib "kernel32" (ByVal
dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcess
Id
As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal
hHandle As Long, ByVal dwMilliseconds As Long) As Long
注:如果以上的声明放在「一般模块」底下, 应将 Declare 之前的 Private 保留字去掉, 并且在 Const 之前加上 Public 保留字。
2. 程序范例:(以执行 Notepad 程序为例)
Dim pId As Long, pHnd As Long ' 分别声明 Process Id 及 Process Handle
变
数
pId = Shell("Notepad", vbNormalFocus) ' Shell 传回 Process Id
pHnd = OpenProcess(SYNCHRONIZE, 0, pId) ' 取得 Process Handle
If pHnd <> 0 Then
Call WaitForSingleObject(pHnd, INFINITE) ' 无限等待,直到程序结束
Call CloseHandle(pHnd)
End If
-----------------------------------------