linux获取窗口句柄,如何获取在winexec或shellexecute中执行的句柄?

没有一般的方法来获得应用程序的“窗口句柄”,因为不能保证任何程序都有一个窗口句柄。一个程序可能有许多顶级的句柄(例如,Microsoft Word,每个文档一个),或者它可能根本没有窗口。您可能会质疑您真正需要窗口句柄做什么;可能有更好的方法来做您试图做的事情,而不需要任何特定的窗口句柄。

WinExec

(已被弃用近15年,因此您应认真考虑不再使用它)和

ShellExecute

如果他们确实启动了任何程序,那么绝对不会返回关于他们启动的程序的信息。(

贝壳执行

可能使用DDE向已经运行的应用程序实例发送命令。)如果它们启动应用程序,则可能在程序再次运行之前完成运行。

你可以使用

CreateProcess

ShellExecuteEx

相反。如果他们启动一个程序,他们会给你一个表示他们启动的程序的进程句柄。您可以使用它来帮助您获得有关该程序的其他信息,例如它的窗口列表。别费心了

FindWindow

;标题和窗口类不能保证是唯一的;一个程序可能对许多不同的窗口使用相同的类名,并且一个程序的多个实例将使用相同的类名,而没有太多方法来选择您真正想要的类名。

EnumWindows

是一个可用于获取候选窗口句柄列表的函数。您给它一个函数指针,它将为桌面上的每个顶级窗口调用该函数一次。您需要一种方法来告诉它您对哪个过程感兴趣,以及一种方法来返回结果列表。函数只接受一个参数,因此该参数必须是指向包含更多信息的结构的指针:

type

PWindowSearch = ^TWindowSearch;

TWindowSearch = record

TargetProcessID: DWord;

ResultList: TWndList;

end;

TWndList

是我编出来的用来存放

HWnd

价值观。如果您有Delphi2009或更高版本,可以使用

TList

;对于早期版本,可以使用

TList

后代或你选择的任何其他人。

创建过程

将在

dwProcessID

会员

TProcessInformation

记录其填写情况;

谢尔执行程序

只返回进程句柄,因此使用

GetProcessID

就这点而言。窗口枚举函数需要与此签名匹配的回调函数:

function SelectWindowByProcessID(Wnd: HWnd; Param: LParam): Bool; stdcall;

你可以使用

枚举窗口

要获得这样的句柄列表:

function GetWindowListByProcessID(pid: DWord): TWndList;

var

SearchRec: TWindowSearch;

begin

Result := TWndList.Create;

try

SearchRec.TargetProcessID := pid;

SearchRec.ResultList := Result;

Win32Check(EnumWindows(SelectWindowByProcessID, LParam(@SearchRec)));

except

Result.Free;

raise;

end;

end;

您将实现如下回调函数:

function SelectWindowByProcessID(Wnd: HWnd; Param: LParam): Bool; stdcall;

var

SearchRec: PWindowSearch;

WindowPid: DWord;

begin

SearchRec := PWindowSearch(Param);

Assert(Assigned(SearchRec));

GetWindowThreadProcessID(Wnd, WindowPid);

if WindowPid = SearchRec.TargetProcessID then

SearchRec.ResultList.Add(Wnd);

Result := True;

end;

一旦您有了这个列表,您就可以检查窗口的其他属性,以确定哪些属性才是您真正想要的。您可以通过窗口标题或类名来确定它,也可以通过窗口中的其他控件来确定它。

使用完进程句柄后,请确保调用

CloseHandle

这样操作系统就可以清除进程的簿记信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值