用NtQueryInformationProcess可以查询单个进程的句柄数 但是要打开进程 用NtQuerySystemInformation可以获取所有进程的统计信息,而且没有任何权限要求 这个用一个api就可以解决,你用pdh涉及到的更多
一般用FindWindow。。。
Delphi中获取其它进程的窗口句柄,在Delphi中获取其它进程的窗口句柄,绝大部分人首先想到的会使用:FindWindow或者用GetWindow来遍历查找,如:
Delphi/Pascal code
handle := FindWindow(nil,PChar('窗口的标题'));
或者:
Delphi/Pascal code
procedure TForm1Button1Click(Sender: TObject);
var
hCurrentWindow: HWnd;
WndText:String;
begin
hCurrentWindow := GetWindow(Handle, GW_HWNDFIRST);
while hCurrentWindow <> 0 do
begin
WndText:=GetWndText(hCurrentWindow);
if UpperCase(WndText)='窗口的标题' then begin
end;
hCurrentWindow:=GetWindow(hCurrentWindow, GW_HWNDNEXT);
end;
end;
因为目前网络上绝大部分的代码都是介绍用这两种方法取得其它进程的窗口句柄。虽这两种方法都可以达到查找其它进程的窗口句柄的目的,但本人认为这两都方法存在较大的弊端。因为这两种方法都是根据其它进程的标题来查找的,如果其它进程的标题在运行时不断的发生变化,那么这两种方法就无法没办法用了。
介绍第三种通过进程的文件名来查找窗口句柄。首先通过进程快照得到要查找的进程ID(ProcessId),其次,再跟据ProcessId获取进程的窗口句柄。以下为本文章的代码:
Delphi/Pascal code
uses TLHelp32;
procedure TForm1Button1Click(Sender: TObject);
var
ProcessName : string; //进程名
FSnapshotHandle:THandle; //进程快照句柄
FProcessEntry32:TProcessEntry32; //进程入口的结构体信息
ContinueLoop:BOOL;
MyHwnd:THandle;
begin
FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); //创建一个进程快照
FProcessEntry32dwSize:=Sizeof(FProcessEntry32);
ContinueLoop:=Process32First(FSnapshotHandle,FProcessEntry32); //得到系统中第一个进程
//循环例举
while ContinueLoop do
begin
ProcessName := FProcessEntry32szExeFile;
if(ProcessName = '要找的应用程序名exe') then begin
MyHwnd := GetHWndByPID(FProcessEntry32th32ProcessID);
end;
ContinueLoop:=Process32Next(FSnapshotHandle,FProcessEntry32);
end;
CloseHandle(FSnapshotHandle); // 释放快照句柄
end;
//跟据ProcessId获取进程的窗口句柄
function TForm1GetHWndByPID(const hPID: THandle): THandle;
type
PEnumInfo = ^TEnumInfo;
TEnumInfo = record
ProcessID: DWORD;
HWND: THandle;
end;
function EnumWindowsProc(Wnd: DWORD; var EI: TEnumInfo): Bool; stdcall;
var
PID: DWORD;
begin
GetWindowThreadProcessID(Wnd, @PID);
Result := (PID <> EIProcessID) or
(not IsWindowVisible(WND)) or
(not IsWindowEnabled(WND));
if not Result then EIHWND := WND;
end;
function FindMainWindow(PID: DWORD): DWORD;
var
EI: TEnumInfo;
begin
EIProcessID := PID;
EIHWND := 0;
EnumWindows(@EnumWindowsProc, Integer(@EI));
Result := EIHWND;
end;
begin
if hPID<>0 then
Result:=FindMainWindow(hPID)
else
Result:=0;
end;
我说的是组件的句柄,不是窗体的句柄
findwindowex();获取指定句柄窗口下的子控件,当然是有句柄的控件
窗体的句柄都知道,还能不知道里面组件的句柄?——windows标准组件
procedure TForm1Button2Click(Sender: TObject);
var
canvas1: TCanvas;
begin
Canvas1 := TCanvasCreate;
//这是OK。这真要感谢baidu,google
canvas1Handle := GetDc(panel1Handle);
canvas1TextOut(1,1,'hello');
canvas1Free ;
Form1CanvasTextOut(10, 10, 'fff');
end;
有的组件是没有句柄的
ShowMessage(IntToStr(TWinControl(Form1FindChildControl('Panel1'))Handle));
在Linux下,我们使用ulimit -n 命令可以看到单个进程能够打开的最大文件句柄数量(socket连接也算在里面)。系统默认值1024。
对于一般的应用来说(象Apache、系统进程)1024完全足够使用。但是如何象squid、mysql、java等单进程处理大量请求的应用来说就有 点捉襟见肘了。如果单个进程打开的文件句柄数量超过了系统定义的值,就会提到“too many files open”的错误提示。如何知道当前进程打开了多少个文件句柄呢?下面一段小脚本可以帮你查看:
lsof -n |awk '{print $2}'|sort|uniq -c |sort -nr|more
在系统访问高峰时间以root用户执行上面的脚本,可能出现的结果如下:
# lsof -n|awk '{print $2}'|sort|uniq -c |sort -nr|more
131 24204
57 24244
57 24231
56 24264
其中第一行是打开的文件句柄数量,第二行是进程号。得到进程号后,我们可以通过ps命令得到进程的详细内容。
ps -aef |grep 24204
mysql 24204 24162 99 16:15 00:24:25 /usr/sbin/mysqld
哦,原来是mysql进程打开最多文件句柄数量。但是他目前只打开了131个文件句柄数量,远远底于系统默认值1024。
但是如果系统并发特别大,尤其是squid服务器,很有可能会超过1024。这时候就必须要调整系统参数,以适应应用变化。Linux有硬性限制和软性限制。可以通过ulimit来设定这两个参数。方法如下,以root用户运行以下命令:
ulimit -HSn 4096
以上命令中,H指定了硬性大小,S指定了软性大小,n表示设定单个进程最大的打开文件句柄数量。个人觉得最好不要超过4096,毕竟打开的文件句柄 数越多响应时间肯定会越慢。设定句柄数量后,系统重启后,又会恢复默认值。如果想永久保存下来,可以修改bash_profile文件,可以修改 /etc/profile 把上面命令加到最后。
通过在正在运行的进程上设置 SeDebugPrivilege 权限,您可以获取进程句柄的任何运行的应用程序。获取进程句柄,然后可以指定 PROCESS_ALL_ACCESS 标志,这将允许该进程句柄,您通常不能在不同 Win32 Api 调用。一些可以成功调用 Win32 Api 包括以下︰
TerminateProcess
CreateRemoteThread
应用程序 #1 (Term01exe)
在 Visual Basic 50 中创建一个新的标准 EXE 项目。
将项目名称更改为 Term01。
将 Form1 重命名为 frmTerm01。
将命令按钮添加到 frmTerm01 中。
为向"终止记事本。"Command1 设置标题
将下面的代码添加到 frmTerm01 中︰
Option Explicit
Private Sub Command1_Click()
' This is a simple application that attempts
' to shut down any process that is passed in through
' the command line
Call TerminateProcess(CLng(Command$), 0)
End Sub
向项目中添加一个标准模块并将其重命名为 MdlApi01。
将下面的代码添加到 MdlApi01 中︰
Option Explicit
Declare Function TerminateProcess Lib "kernel32" _
(ByVal hProcess As Long, _
ByVal uExitCode As Long) As Long
保存项目并使 exe 文件 (Term01exe)。
很通俗的跟你解释一下
系统里有很多东西,这些东西都有一个身份z
身份z就是“句柄”(也不知道谁给取的这个奇怪的名字)
不是说一个程序 只有一个句柄
句柄绝对比你想象的要多的多 也就是说 分的很细
最简单的例子,打开系统自带的计算器
上面每一个按钮 那些什么1234 加减乘除 每个按钮都有自己的身份z
这样一来 你就可以很有针对性的对系统中的某一个“东西” 来进行 *** 作了。
应该能理解句柄是怎么回事了吧?
获取句柄 最基本的 两条思路,一就是那个你很感兴趣的“东西”,它自己就有一个属性(一般属性名都是 Hwnd),里面就存放着他自己的句柄,比如你输入 Msgbox MeHwnd 运行一下 就可以获得当前窗体的句柄
二就是 你通过一些专门设计出来,用来获得XX东西句柄的API函数
那个你查阅下API的相关书籍 就可以了,
VB里面 最简单的句柄么 就是窗体本身自己的句柄咯
最简单的代码 上面已经说了 就是这么一句话 Msgbox MeHwnd 你可以去试试
以上就是关于linux获取进程句柄数怎么获取全部的内容,包括:linux获取进程句柄数怎么获取、如何使用FindWindowEx获取窗体内控件句柄、如何查看LINUX单进程能够打开的最大文件句柄数等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)