win2k,xp如何结束指定进程?请高手指点!

leocubic 2003-06-12 06:49:37
我想关闭已知可执行文件具体路径的系统中正在运行的进程,最好能正常结束,希望各位高手给予指点!万分感谢!另外,如有高手知道如何在win98下获得当前网络连接上传下载数据量的方法也请告知,多谢多谢!
...全文
49 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
Huaraco 2003-06-16
  • 打赏
  • 举报
回复
'查找进程
dhWnd=Findwindow (vbNullString, MyString)
'获取进程id
GetWindowThreadProcessId dhWnd, pID
'获取进程hwnd
pHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pID)
'用sendmessage发送关闭消息
sendmessage phandle, WM_CLOSE, 0&, 0&
bbe 2003-06-16
  • 打赏
  • 举报
回复
Private Const TOKEN_ADJUST_PRIVILEGES = &H20
Private Const TOKEN_QUERY = &H8
Private Const SE_PRIVILEGE_ENABLED = &H2


Private Type LUID
UsedPart As Long
IgnoredForNowHigh32BitPart As Long
End Type

Private Type TOKEN_PRIVILEGES
PrivilegeCount As Long
TheLuid As LUID
Attributes As Long
End Type

Public Declare Function OpenProcess Lib "Kernel32.dll" _
(ByVal dwDesiredAccessas As Long, ByVal bInheritHandle As Long, _
ByVal dwProcId As Long) As Long
Public Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Declare Function OpenProcessToken Lib "advapi32" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As Long
Private Declare Function LookupPrivilegeValue Lib "advapi32" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, ByVal lpName As String, lpLuid As LUID) As Long
Private Declare Function AdjustTokenPrivileges Lib "advapi32" (ByVal TokenHandle As Long, ByVal DisableAllPrivileges As Long, NewState As TOKEN_PRIVILEGES, ByVal BufferLength As Long, PreviousState As TOKEN_PRIVILEGES, ReturnLength As Long) As Long

Public Sub InitDebugLevel()
Dim hProcessHandle As Long
Dim hTokenHandle As Long
Dim tmpLuid As LUID
Dim tkpNew As TOKEN_PRIVILEGES
Dim tkpPrevious As TOKEN_PRIVILEGES
Dim lBufferNeeded As Long

hProcessHandle = GetCurrentProcess()
Call OpenProcessToken(hProcessHandle, TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, hTokenHandle)


Call LookupPrivilegeValue("", "SeDebugPrivilege", tmpLuid)

tkpNew.PrivilegeCount = 1
tkpNew.TheLuid = tmpLuid
tkpNew.Attributes = SE_PRIVILEGE_ENABLED


lBufferNeeded = 0
Call AdjustTokenPrivileges(hTokenHandle, False, tkpNew, Len(tkpPrevious), tkpPrevious, lBufferNeeded)

End Sub

Public sub Kill(ProcId as long)
dim hProcess as long
hProcess = OpenProcess(&H1, False, ProcId)
TerminateProcess hProcess , 0&
End Sub


Private Sub Form_Load()
Call InitDebugLevel()
End Sub
leocubic 2003-06-14
  • 打赏
  • 举报
回复
TO: twtmonkey(狂草客)
能说得具体点吗?谢谢!
twtmonkey 2003-06-14
  • 打赏
  • 举报
回复
我认为先新建一个进程设置其优先级再调用API关闭指定的进程
leocubic 2003-06-14
  • 打赏
  • 举报
回复
我的意思是:想中止的进程是随机的,或者说是用户指定的,就像进程管理器那样。并不是只是QQ,而且QQ的问题更大,我用过PostMessage,不是无法关闭就是QQ报错,所以我希望能用ExitProcess这样的函数直接结束进程,不知可不可以。我也试过,不过ExitProcess好像是结束当前进程,一运行vb就结束了,呵呵,不知有没有类似的办法结束我想结束的进程呢?
ydzqw 2003-06-14
  • 打赏
  • 举报
回复
一个进程可能有一个线程或多个线程,进程只是提供一个"平台",让线程在上面活动,进程是不活泼的

你要结束的只是进程啦
ydzqw 2003-06-14
  • 打赏
  • 举报
回复
QQ?
呵呵,QQ的窗体名称好象是随机变的,防木马
你用spy++应该可以看到窗体名称的,Visual Studio自带的tool

还有,Ctrl+Alt+Delete,任务管理器,你也可以看到窗体名称啊
leocubic 2003-06-14
  • 打赏
  • 举报
回复
两位高手,等你们很久了,怎么还不给我回复呀?多谢,帮帮忙吧!
leocubic 2003-06-14
  • 打赏
  • 举报
回复
To:ydzqw(===七条狗===)(@@我不爱做菜)
你给的代码我试过了,并不是每个程序都可以这样关闭的,例如QQ(1230b),主窗体无法关闭,而且在关闭一些窗体的时候还会报错!所以我不想用这种办法。我在win98下用的是TerminateProcess,可以实现我的要求,但在win2k下好像是要指定什么安全级别,所以总是失败,不知你有什么办法能解决这问题吗?
ydzqw 2003-06-14
  • 打赏
  • 举报
回复
我贴出的代码不是实现了功能了吗?
我试过的

你指定一个进程的窗体名称就行了。
leocubic 2003-06-12
  • 打赏
  • 举报
回复
不好意思,各位,我是初学者,API知识比较少,问题比较傻,还请大家多原谅!

To: ydzqw(===七条狗===)(@@我不爱做菜)
我只知道程序的完整路径,例如:C:\Program Files\Tencent\QQ.exe,但我不知道程序都有哪些窗体,更不知道窗体的类名和标题,如何使用您给的源代码呢?

To: rappercn(rapper)
不好意思,我不大清楚线程与进程到底是个什么关系,是一一对应吗?还是一个进程有多个线程呢?线程ID我又怎么得到呢?是不是慢烦您给个详细点的例子,我这里多谢了!!
rappercn 2003-06-12
  • 打赏
  • 举报
回复
PostThreadMessage

VB声明
Declare Function PostThreadMessage Lib "user32" Alias "PostThreadMessageA" (ByVal idThread As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
说明
将一条消息投递给应用程序。这条消息由应用程序的内部GetMessage循环获得,但不会传给一个特定的窗口
返回值
Long,如消息投递成功,则返回TRUE(非零)。会设置GetLastError
参数表
参数 类型及说明
idThread Long,用于接收消息的那个线程的标识符
msg Long,消息标识符
wParam Long,具体由消息决定
ByVal Long,具体由消息决定



WM_CLOSE
ydzqw 2003-06-12
  • 打赏
  • 举报
回复
刚好找到代码,本来还想自己写的呢,省事了。
:)

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Const SW_SHOWNORMAL = 1
Const WM_CLOSE = &H10
Const gcClassnameMSWord = "OpusApp"
Const gcClassnameMSExcel = "XLMAIN"
Const gcClassnameMSIExplorer = "IEFrame"
Const gcClassnameMSVBasic = "wndclass_desked_gsk"
Const gcClassnameNotePad = "Notepad"
Const gcClassnameMyVBApp = "ThunderForm"
Private Sub Form_Load()
'KPD-Team 1998
'URL: http://www.allapi.net/
'E-Mail: KPDTeam@Allapi.net
Dim WinWnd As Long, Ret As String, RetVal As Long, lpClassName As String
'Ask for a Window title
Ret = InputBox("Enter the exact window title:" + Chr$(13) + Chr$(10) + "Note: must be an exact match")
'Search the window
WinWnd = FindWindow(vbNullString, Ret)
If WinWnd = 0 Then MsgBox "Couldn't find the window ...": Exit Sub
'Show the window
ShowWindow WinWnd, SW_SHOWNORMAL
'Create a buffer
lpClassName = Space(256)
'retrieve the class name
RetVal = GetClassName(WinWnd, lpClassName, 256)
'Show the classname
MsgBox "Classname: " + Left$(lpClassName, RetVal)
'Post a message to the window to close itself
PostMessage WinWnd, WM_CLOSE, 0&, 0&
End Sub
ydzqw 2003-06-12
  • 打赏
  • 举报
回复
取得ProcessID
SendMessage ExitCode

......
boywang 2003-06-12
  • 打赏
  • 举报
回复
.........一言难尽啊!
leocubic 2003-06-12
  • 打赏
  • 举报
回复
各位高手帮帮忙!急呀!在线等!

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧