如何获取一个应用程序的handle,并且结束该应用程序

liyoukebit 2004-12-06 12:12:14
请给出代码。
...全文
141 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
liyoukebit 2004-12-07
  • 打赏
  • 举报
回复
小吉说得太对了,我关闭了控制面板中添加/删除的程序的子窗体,但是添加/删除程序的窗体停止响应了
laviewpbt 2004-12-06
  • 打赏
  • 举报
回复
如果是在自己的应用程序打开的可以利用下的代码
Dim ProcessId As Long
Private Const PROCESS_QUERY_INFORMATION = &H400 '关闭由SHELL函数打开的文件
Private Const PROCESS_TERMINATE = &H1
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
Private Sub Command1_Click()
ProcessId = Shell("notepad.exe", vbNormalFocus)
End Sub

Private Sub Form_Unload(Cancel As Integer)
Dim hProcess As Long
hProcess = OpenProcess(PROCESS_TERMINATE Or PROCESS_QUERY_INFORMATION, False, ProcessId)
Call TerminateProcess(hProcess, 3838)
End Sub

这种方法的优点是不会关闭其他的具有相同标题的程序
而用sendmessage和findwindow则可能存在这种危险。
bboos 2004-12-06
  • 打赏
  • 举报
回复
WM_CLOSE不能关闭吗? 那再用WM_DESTROY试试

SendMessage hwnd, WM_DESTROY, 0, 0
True1024 2004-12-06
  • 打赏
  • 举报
回复

此代码只关闭应用程序所打开的计算器,如果不是利用代码打开的计算器则不能关闭。
zyp2kyear 2004-12-06
  • 打赏
  • 举报
回复
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
Public Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Public Const WM_CLOSE = &H10

public sub closeapp(caption as string) ' You have openned application's caption
winHwnd = FindWindow(vbNullString, caption)
If winHwnd <> 0 Then
SetForegroundWindow winHwnd
Call PostMessage(winHwnd, WM_CLOSE, 0&, 0&)
End If
end sub
True1024 2004-12-06
  • 打赏
  • 举报
回复
'打开计算器
pID = Shell("Calc.EXE", 1)
AppActivate pID

'关闭计算器
Dim hWnd As Long
On Error Resume Next
hWnd = FindProcessWindow(pID)
SetForegroundWindow hWnd
PostMessage hWnd, WM_CLOSE, 0, 0&
happy_sea 2004-12-06
  • 打赏
  • 举报
回复
首先声明两个函数:

  Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

  Declare Function PostMessage Lib "user32" Alias "PostMessageA"(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

  例如要检测“计算器”程序是否正在运行,如果是则关闭它,可以使用如下代码来实现:

  Dim winHwnd As Long

  Dim RetVal As Long

  winHwnd=FindWindow(vbNullString,"计算器")

  If winHwnd〈〉0 Then

  RetVal = PostMessage(winHwnd, &&H10, 0&&, 0&&)

  If RetVal = 0 Then

  MsgBox "关闭计算器出错!"

  End If

  Else

  MsgBox "计算器程序没有运行。"

  End If

True1024 2004-12-06
  • 打赏
  • 举报
回复
Public pID As Long
Public hWndProcess As Long
Public Const WM_CLOSE = &H10
Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Public Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Public Declare Function GetParent Lib "user32" (ByVal hWnd As Long) As Long
Public Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As Long, lpdwProcessId As Long) As Long
Public Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Declare Function SetForegroundWindow Lib "user32" (ByVal hWnd As Long) As Long
Private Function EnumWindowsProc(ByVal hWnd As Long, ByVal lParam As Long) As Boolean
Dim pID As Long
GetWindowThreadProcessId hWnd, pID
If pID = lParam Then
If GetParent(hWnd) = 0 Then
hWndProcess = hWnd
EnumWindowsProc = False
End If
End If
EnumWindowsProc = True
End Function
Private Function FindProcessWindow(ByVal pID As Long) As Long
hWndProcess = 0
EnumWindows AddressOf EnumWindowsProc, pID
FindProcessWindow = hWndProcess
End Function
homezj 2004-12-06
  • 打赏
  • 举报
回复
你没来晚,大家都把问题想得太简单了!一两次实践的成功,并不代表就掌握了真理。

发送WM_CLOSE消息(WM_DESTROY不要用),是比较文明的方法,但这种方法存很多问题:
1、它需要被并闭程序自身的响应,若被关闭程序拒绝执行Unload事件,发消息是没用的。如:FlashGet,发送WM_CLOSE,它选择的是隐藏进系统托盘。
2、关闭了窗体,并不代表结束了应用程序。因为很多程序是有多个窗体的。
3、相同标题的窗体是很多的,操作对象有不确定因素;
4、此法对很多没有可视窗体的程序无效。
.....

文明的方法不行,可以来硬的,强行结束进程,就象Windows任务管理器一样。TerminateProcess可搞定!

但,还是不能高兴的太早,虽然能用GetWindowThreadProcessId或CreateToolhelpSnapshot可找到或列出你要关闭进程的ProcessID,可TerminateProcess需要的是Process的Handle,而不是ProcessID。

怎么办,OpenProcess可返回Process的Handle,似乎没问题了?。。。。。。。

NT/2K/XP/2003下就有问题。没有权限!又是讨厌的令牌操作AdjustTokenPrivileges,很累呀!所以,不要急着接分了,关闭其他程序的问题是可以写一篇论文的。
creazyfish 2004-12-06
  • 打赏
  • 举报
回复
来晚了,帮你up
aohan 2004-12-06
  • 打赏
  • 举报
回复
up接分了
saiko 2004-12-06
  • 打赏
  • 举报
回复
来晚了 :(
支持 True1024 的方法
liyoukebit 2004-12-06
  • 打赏
  • 举报
回复
呵呵,谢谢各位,我试试看,等会给分。^_^

7,762

社区成员

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

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