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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
执行系统shell的文件操作命令时,需要考虑安全问题和跨平台兼容性问题。以下是四个常用的执行系统shell的文件操作命令的函数,以及它们的使用建议: 1. `system()`函数:`system()`函数可以执行操作系统命令,并等待命令执行完成。使用`system()`函数时,需要特别注意安全问题,因为在执行过程,任何人都可以通过命令注入来执行恶意命令,从而导致安全问题。因此,应该避免使用`system()`函数,或者在使用时进行必要的安全检查。 2. `popen()`函数:`popen()`函数可以执行系统命令,并将命令的输出读取到程序。`popen()`函数通常比`system()`函数更安全,因为它可以将命令的输出读取到程序,从而避免了命令注入的风险。但是,`popen()`函数也需要进行必要的安全检查,以避免安全问题。 3. `WinExec()`函数:`WinExec()`函数是Windows系统用于执行命令的函数,它可以执行Windows命令,并等待命令执行完成。`WinExec()`函数只能在Windows系统使用,因此在跨平台应用程序需要使用其他函数。 4. `ShellExecute()`函数:`ShellExecute()`函数是Windows系统用于执行文件的函数,它可以打开文件、执行命令等。`ShellExecute()`函数可以自动选择合适的程序来执行文件,因此在Windows系统使用非常方便。但是,`ShellExecute()`函数只能在Windows系统使用,因此在跨平台应用程序需要使用其他函数。 综上所述,建议在执行系统shell的文件操作命令时,优先使用`popen()`函数,并进行必要的安全检查。在Windows系统,可以使用`ShellExecute()`函数来执行文件操作命令。需要注意的是,在使用这些函数时,应该避免使用用户输入的数据作为命令参数,以避免命令注入等安全问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值