进程对应的句柄数是怎么得到的?

gpo2002 2003-10-07 03:34:37
win2000环境,ctrl+alt+del,打开进程列表,菜单:察看-〉列-〉句柄
可以看到各个进程对应的句柄数

如何可以得到这个句柄数???

...全文
126 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
bbe 2003-10-09
  • 打赏
  • 举报
回复
typedef struct _SYSTEM_HANDLE
{
DWORD ProcessID;
WORD HandleType;
WORD HandleNumber;
DWORD KernelAddress;
DWORD Flags; //?PROCESS_QUERY_INFORMATION | PROCESS_VM_READ
} SYSTEM_HANDLE;

typedef struct _SYSTEM_HANDLE_INFORMATION
{
DWORD Count;
SYSTEM_HANDLE Handles[1];
} SYSTEM_HANDLE_INFORMATION;

NtQuerySystemInfomation获得所有句柄的信息结构数组
用SYSTEM_HANDLE.ProcessID查找你要的句柄
gpo2002 2003-10-09
  • 打赏
  • 举报
回复
To James0001 :如何得到?能否说详细点?
James0001 2003-10-09
  • 打赏
  • 举报
回复
枚举进程时就可以得到。
lvlvlvlylyly 2003-10-09
  • 打赏
  • 举报
回复
晕~~
看错题了~
lvlvlvlylyly 2003-10-09
  • 打赏
  • 举报
回复
GetCurrentProcessId
Public Declare Function GetCurrentProcessId Lib "kernel32" () As Long
可以看到,在它的扩号里面没有参数,这说明它可以直接调用或者赋值。我们现在先来做一个简单的实验,从而使我们对于“当前进程ID”有一个直观的了解。
在启动窗体上放置一个CommandButton、一个Label,代码窗体上写下如下代码:
Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long
Private Sub Command1_Click()
Dim lngProcessID As Long
lngProcessID = GetCurrentProcessId()
Label1.Caption = lngProcessID
End Sub
运行之后你看到了什么?一个绝对值很大的负数?那么恭喜你,你已经知道了直观的“当前进程ID”是什么样子了。顺便补充一句,你现在看到的这个数也就是我们这个实验的“当前进程ID”。


RegisterServiceProcess
Public Declare Function RegisterServiceProcess Lib "kernel32" (ByVal dwProcessID As Long, ByVal dwType As Long) As Long
这一函数用来操作“任务列表”,当我们按下Ctrl+Alt+Delete键组合时,会弹出任务列表对话框,在这里可以清楚看到当前计算机所运行的任务,这里其实就用到了上面的函数,系统首先捕捉到一些运行着的“进程ID”,然后才显示在这一对话框中。但是经常有些任务我们希望它能在这一任务列表里隐藏,同过这一函数便可以很方便地做到这一点。
注意到它有两个参数,前面一个通过名称应该是“进程ID”,后面一个暂时我们还不清楚。由于这个函数很奇怪,在VB自带的API浏览器中居然找不到,所以建议在一些对“任务列表”进行操作的程序代码中经常注意它的用法,并随时补充到自己的笔记本中。现在我们先找到一个这样的一段代码:
Public Declare Function GetCurrentProcessId Lib "kernel32" () As Long
Public Declare Function RegisterServiceProcess Lib "kernel32" (ByVal dwProcessID As Long, ByVal dwType As Long) As Long
Public Const RSP_SIMPLE_SERVICE = 1
Public Const RSP_UNREGISTER_SERVICE = 0 (这几句写在模块中)
Public Sub RemoveProgramFromList()
Dim lngProcessID As Long
Dim lngReturn As Long
'取得当前运行程序id
lngProcessID = GetCurrentProcessId()
'从列表中删除程序
lngReturn = RegisterServiceProcess(pid, RSP_SIMPLE_SERVICE)
End Sub
Public Sub AddProgramToList()
Dim lngProcessID As Long
Dim lngReturn As Long
'取得当前运行程序id
lngProcessID = GetCurrentProcessId()
'在列表中加入程序
lngReturn = RegisterServiceProcess(pid, RSP_UNREGISTER_SERVICE)
End Sub
Private Sub Command1_Click()
RemoveProgramFromList
End Sub
Private Sub Command2_Click()
AddProgramToList
End Sub
这段代码意思很明显用于从任务列表里面移除或者添加当前进程,lngReturn用于返回执行结果,在RegisterServiceProcess后面的扩号里面应该就是它的两个参数,在这里它首先声明了两个变量RSP_SIMPLE_SERVICE = 1和RSP_UNREGISTER_SERVICE = 0。整段代码还是比较简洁的,意思显而易见,前面一个参数用于指明要进行操作的进程(当然它的用法跟我们想象中不太一样,但是想一想也就不难明白,pid肯定是一个默认的当前进程,因为操作的对象是“当前进程”,当然不需要实际而直观的得到这个值,而且pid恰好就是ProcessId几个字母缩写),后面一个参数用于指明操作的内容,当是一的时候用来移除,是零的时候用来添加。当然目前我们仅只通过猜测,可以做一两个小试验来检验一下我们的猜测是否正确。一个应用程序通常都是在任务列表隐藏自身,而目前我们尚不知道如何在当前进程中得到其它进程的方法,为了使我们的试验直观而有效,我们最好同时开两个VB窗口,一个写上前面有关GetCurrentProcessId函数中所用到的那个试验的代码,运行一次会得到这个进程的ID,将工程名改为ID的值(先假设你得到的ID是X),这样我们按下Ctrl+Alt+Delete键组合便可以在任务列表中很清楚的看到这个程序。(前提是不要关闭它)然后再新建一个工程,写上前面我们找到的那段代码,但是需要修改几个地方:
Public Declare Function RegisterServiceProcess Lib "kernel32" (ByVal dwProcessID As Long, ByVal dwType As Long) As Long (这几句写在模块中)
Public Sub RemoveProgramFromList()
Dim lngReturn As Long
'从列表中删除程序
lngReturn = RegisterServiceProcess(X, 1)
End Sub
Public Sub AddProgramToList()
Dim lngReturn As Long
'在列表中加入程序
lngReturn = RegisterServiceProcess(X,0)
End Sub
Private Sub Command1_Click()
RemoveProgramFromList
End Sub
Private Sub Command2_Click()
AddProgramToList
End Sub
online 2003-10-08
  • 打赏
  • 举报
回复
呵呵
好像不太对
online 2003-10-08
  • 打赏
  • 举报
回复
你试试

Private Type POINTAPI
x As Long
y As Long
End Type
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) 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 SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long

Private Sub Command1_Click()
If Command1.Caption = "开始抓取(&S)" Then
Timer1.Enabled = True
Command1.Caption = "停止抓取(&S)"
Else
Timer1.Enabled = False
Command1.Caption = "开始抓取(&S)"
End If
End Sub

Private Sub Command2_Click()
End
End Sub

Private Sub Form_Load()
SetWindowPos Me.hwnd, -1, 0, 0, 0, 0, &H1 Or &H2 '使窗体位于最顶端
End Sub

Private Sub Timer1_Timer()
On Error Resume Next
Dim tPoint As POINTAPI
Dim hWin As Long
Dim str As String * 255
Dim Abc As String * 64000
Dim Txt(64000) As Byte
GetCursorPos tPoint '获得当前鼠标位置
hWin = WindowFromPoint(tPoint.x, tPoint.y) '获得窗口名柄
If hWin = Me.hwnd Or hWin = Command1.hwnd Or hWin = Command2.hwnd Or hWin = Text1.hwnd Then Exit Sub '确定窗口不在 Form1 中
GetClassName hWin, str, 255 '获得窗口类
SendMessage hWin, &HD, 64000, Txt(0) '获得窗口标题(也可使用 API 函数:GetWindowText,但效果不佳)
Label1.Caption = "窗口名柄: " & hWin
Label2.Caption = "窗口类: " & str
Text1.Text = StrConv(Txt, vbUnicode)
End Sub

gpo2002 2003-10-08
  • 打赏
  • 举报
回复
up
boywang 2003-10-08
  • 打赏
  • 举报
回复
kpeb
gpo2002 2003-10-08
  • 打赏
  • 举报
回复
up
yunfeng007 2003-10-07
  • 打赏
  • 举报
回复
学习!~~
aha99 2003-10-07
  • 打赏
  • 举报
回复
up

1,486

社区成员

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

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