findwindowex如何使用FindWindowEx获取窗体内控件句柄

findwindowex  时间:2022-02-23  阅读:()

如何使用FindWindowEx获取窗体内控件句柄

一般用FindWindow。。。 Delphi中获取其它进程的窗口句柄,在Delphi中获取其它进程的窗口句柄,绝大部分人首先想到的会使用:FindWindow或者用GetWindow来遍历查找,如: Delphi/Pascal code? handle := FindWindow(nil,PChar('窗口的标题')); 或者: Delphi/Pascal code? procedure TForm1.Button1Click(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 TForm1.Button1Click(Sender: TObject); var ProcessName : string; //进程名 FSnapshotHandle:THandle; //进程快照句柄 FProcessEntry32:TProcessEntry32; //进程入口的结构体信息 ContinueLoop:BOOL; MyHwnd:THandle; begin FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); //创建一个进程快照 FProcessEntry32.dwSize:=Sizeof(FProcessEntry32); ContinueLoop:=Process32First(FSnapshotHandle,FProcessEntry32); //得到系统中第一个进程 //循环例举 while ContinueLoop do begin ProcessName := FProcessEntry32.szExeFile; if(ProcessName = '要找的应用程序名.exe') then begin MyHwnd := GetHWndByPID(FProcessEntry32.th32ProcessID); ... ... end; ContinueLoop:=Process32Next(FSnapshotHandle,FProcessEntry32); end; CloseHandle(FSnapshotHandle); // 释放快照句柄 end; //跟据ProcessId获取进程的窗口句柄 function TForm1.GetHWndByPID(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 <> EI.ProcessID) or (not IsWindowVisible(WND)) or (not IsWindowEnabled(WND)); if not Result then EI.HWND := WND; end; function FindMainWindow(PID: DWORD): DWORD; var EI: TEnumInfo; begin EI.ProcessID := PID; EI.HWND := 0; EnumWindows(@EnumWindowsProc, Integer(@EI)); Result := EI.HWND; end; begin if hPID<>0 then Result:=FindMainWindow(hPID) else Result:=0; end; 我说的是组件的句柄,不是窗体的句柄 findwindowex();获取指定句柄窗口下的子控件,当然是有句柄的控件 窗体的句柄都知道,还能不知道里面组件的句柄?——windows标准组件 procedure TForm1.Button2Click(Sender: TObject); var canvas1: TCanvas; begin Canvas1 := TCanvas.Create; //这是OK。这真要感谢baidu,google canvas1.Handle := GetDc(panel1.Handle); canvas1.TextOut(1,1,'hello'); canvas1.Free ; Form1.Canvas.TextOut(10, 10, 'fff'); end; 有的组件是没有句柄的 ShowMessage(IntToStr(TWinControl(Form1.FindChildControl('Panel1')).Handle));

ShockHosting日本机房VPS测试点评

这个月11号ShockHosting发了个新上日本东京机房的邮件,并且表示其他机房可以申请转移到日本,刚好赵容手里有个美国的也没数据就发工单申请新开了一个,这里做个简单的测试,方便大家参考。ShockHosting成立于2013年,目前提供的VPS主机可以选择11个数据中心,包括美国洛杉矶、芝加哥、达拉斯、杰克逊维尔、新泽西、澳大利亚、新加坡、日本、荷兰和英国等。官方网站:https://shoc...

Virmach 3.23美元可用6个月的VPS主机

Virmach 商家算是比较久且一直在低价便宜VPS方案中玩的不亦乐乎的商家,有很多同时期的商家纷纷关闭转让,也有的转型到中高端用户。而前一段时间也有分享过一次Virmach商家推出所谓的一次性便宜VPS主机,比如很低的价格半年时间,时间到服务器也就关闭。这不今天又看到商家有提供这样的产品。这次的活动产品包括圣何塞和水牛城两个机房,为期六个月,一次性付费用完将会取消,就这么特别的产品,适合短期玩玩...

hostyun评测香港原生IPVPS

hostyun新上了香港cloudie机房的香港原生IP的VPS,写的是默认接入200Mbps带宽(共享),基于KVM虚拟,纯SSD RAID10,三网直连,混合超售的CN2网络,商家对VPS的I/O有大致100MB/S的限制。由于是原生香港IP,所以这个VPS还是有一定的看头的,这里给大家弄个测评,数据仅供参考!9折优惠码:hostyun,循环优惠内存CPUSSD流量带宽价格购买1G1核10G3...

findwindowex为你推荐
sdf弱电SDF什么意思xclientxclient校园网的客户端一直显示查找设备的原因?????急急急,好多天不能上网了···········appcan怎样做手机软件rbf神经网络rbf神经网络的隐含层节点数是怎么样确定的settimervc++6.0 settimer函数是怎么用的啊,能给个例子在讲解一下行么showwindowC#中showwindow控件在哪里??最开放的浏览器用的最多的三个浏览器是?备忘录模式华为荣耀5X怎么在手机上新建一个备忘录qq业务中心QQ业务办理新手怎么制作表格如何学会制作表格?
台湾主机 虚拟主机测评 厦门域名注册 电信服务器租用 php空间租用 北京租服务器 播放vps上的视频 免费域名解析 z.com cpanel主机 omnis 128m内存 iisphpmysql 网盘申请 魔兽世界台湾服务器 免空 腾讯云分析 共享主机 1g空间 稳定免费空间 更多