如何用vb结束一个程序

如何用vb结束一个程序,第1张

调用系统自带的taskkill

call shell("taskkill /im " & "XXXEXE",vbhide)

使用API:

Attribute VB_Name = "killtask"

Option Explicit

Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long

Private Declare Function Process32First Lib "kernel32" (ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As Long

Private Declare Function Process32Next Lib "kernel32" (ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As Long

Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal blnheritHandle As Long, ByVal dwAppProcessId As Long) As Long

Private Declare Function TerminateProcess Lib "kernel32" (ByVal ApphProcess As Long, ByVal uExitCode As Long) As Long

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 1024

End Type

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

Dim pid As Long

Dim pname As String

'-------------结束进程通用函数 注意进程名要区分大小写

Private Sub taskkill(ByVal taskname As String)

Dim my As PROCESSENTRY32

Dim l As Long

Dim l1 As Long

Dim flag As Boolean

Dim mName As String

Dim i As Integer

l = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)

If l Then

mydwSize = 1060

If (Process32First(l, my)) Then '遍历第一个进程

Do

i = InStr(1, myszExeFile, Chr$(0))

mName = LCase$(Left$(myszExeFile, i - 1))

If mName = LCase$(taskname) Then

pid = myth32ProcessID

pname = mName

Dim mProcID As Long

mProcID = OpenProcess(1&, -1&, pid)

TerminateProcess mProcID, 0&

flag = True

Exit Sub

Else

flag = False

End If

Loop Until (Process32Next(l, my) < 1) '遍历所有进程知道返回值为False

End If

l1 = CloseHandle(l)

End If

End Sub

程序中调用taskkill即可

call taskkill("XXXEXE")

补充: 看到其他答案说到修改EXE、设断点、特权指令等,其实没那么复杂,现在的系统是按线程调度的,线程的状态是有系统决定的,要让进程暂停,只需让系统把进程的所有线程挂起,不分配CPU,进程当然就没法运行啦,而系统就提供了这样的接口啊,用就可以了。 对于修改EXE,可以在你要暂停的地方插入JMP指令,跳到你的暂停代码里,暂停代码用Sleep或WaitforSingleObject等待都可以,不过想在原代码插入JMP指令很难,修改了原指令就要恢复的,这可不简单啊。 对于设断点,这个可以,VB也可以实现,用DEBUG API就可以了,不过这是暂停的程序就处于DEBUG状态,而不是普通状态了,这是有差别的。 至于用特权指令暂停CPU,这好像不行吧,CPU停了,我们的程序也暂停了。这是内核级调试程序用的。 追问: 能给出代码吗,看是看懂了,但不知道这些函数怎么声明和使用。 回答: 不好意思,我用手机上的网,没电脑,没法给你声明,也没法给你代码,不过你可以查查MSDN的C原型,在转为VB声明,VB有个可以插入API声明的工具,可以用该工具对已有的声明进行修改。

在程序代码最上边加上:

Private Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long)

在想暂停的地方,运行Sleep 1000 '1000代表1秒

以上就是关于如何用vb结束一个程序全部的内容,包括:如何用vb结束一个程序、VB如何暂停一个程序的运行、vb如何停止代码执行等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9308523.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-27
下一篇2023-04-27

发表评论

登录后才能评论

评论列表(0条)

    保存