如何获取winexec或shellexecute中执行的Handle?

2023-12-23

我用来创建像 winexec(...):Hand 这样的自定义函数,它将返回执行的应用程序的句柄。

我确实使用了 findwindow() 但如果它更改窗口标题就会出现问题。


没有一种通用方法可以获取应用程序的“该”窗口句柄,因为不能保证任何程序都有一个窗口句柄。一个程序可能有许多顶级句柄(例如,Microsoft Word,每个文档一个),或者它可能根本没有窗口。您可能会问您真正需要窗口句柄的目的是什么?可能有更好的方法来做你想做的事情,不需要任何特定的窗口句柄。

WinExec(它已经被弃用近 15 年了,所以你应该认真考虑不再使用它)和ShellExecute如果他们确实启动了任何程序,则绝对不会返回有关他们启动的程序的信息。 (ShellExecute可能使用 DDE 向应用程序的已运行实例发送命令。)并且如果他们启动应用程序,它可能会在您的程序开始运行之前完成运行。

您可以使用CreateProcess http://msdn.microsoft.com/en-us/library/ms682425.aspx or ShellExecuteEx http://msdn.microsoft.com/en-us/library/bb762154.aspx反而。如果他们启动一个程序,他们会给您一个代表他们启动的程序的进程句柄。您可以使用它来帮助您获取有关该程序的其他信息,例如其窗口列表。别打扰FindWindow;标题和窗口类不保证是唯一的;一个程序可能会对许多不同的窗口使用相同的类名,并且一个程序的多个实例将使用相同的类名,而没有太多方法可以选择您真正想要的类名。

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

type
  PWindowSearch = ^TWindowSearch;
  TWindowSearch = record
    TargetProcessID: DWord;
    ResultList: TWndList;
  end;

TWndList是我创建的用于保存列表的类型HWnd价值观。如果您有 Delphi 2009 或更高版本,您可以使用TList<HWnd>;对于早期版本,您可以使用TList后代或任何你选择的其他东西。

CreateProcess会告诉你新的进程IDdwProcessID的成员TProcessInformation记录它填满;ShellExecuteEx只返回一个进程句柄,所以使用GetProcessID http://msdn.microsoft.com/en-us/library/ms683215.aspx关于这一点。窗口枚举函数需要一个与此签名匹配的回调函数:

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

您可以使用EnumWindows获取这样的句柄列表:

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以便操作系统可以清理进程的簿记信息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何获取winexec或shellexecute中执行的Handle? 的相关文章

  • 如何使用AWK脚本检查表的所有列数据类型? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 在这里 我正在检查表中第一列的数据类型 但我想知道AWK中表的所有列数据类型 我尝试过 但只能获得一列数据类型 例如 Column 1
  • 如何剪切(1) 个驼峰字?

    Bash 中有没有一种简单的方法可以将驼峰式单词拆分为其组成词 例如 我想将 aCertainCamelCasedWord 拆分为 a certain Camel Cased Word 并能够选择我感兴趣的那些字段 当单词分隔符是下划线时
  • 如何让“grep”从文件中读取模式?

    假设有一个很大的文本文件 我只想打印与某些模式不匹配的行 显然 我可以使用egrep v patter1 pattern2 pattern3 现在 如果所有这些模式都在一个文本文件中怎么办 最好的制作方法是什么egrep从文件中读取模式 g
  • 从 Delphi 调用 C# dll

    我用单一方法编写了 Net 3 5 dll 由Delphi exe调用 不幸的是它不起作用 步骤 1 使用以下代码创建 C 3 5 dll public class MyDllClass public static int MyDllMet
  • 在Delphi 7中,为什么我可以给const赋值?

    我将一些 Delphi 代码从一个项目复制到另一个项目 发现它在新项目中无法编译 但在旧项目中可以编译 代码看起来像这样 procedure TForm1 CalculateGP const Price money 0 begin Pric
  • 调试器异常错误和内存超调

    我尝试运行以下代码 但它显示有关内存地址的错误 并显示一条消息 循环后 n 可能未定义 请看一看 var n max integer n integer r R1 f h0 Array of Real const h 0 00889 nip
  • 如何使用 bash 显示具有两个子文件夹的文件夹?

    我通过 Cygwin 使用 bash 我有一个大文件夹 a 有很多子文件夹 b 这些子文件夹各有一个或两个子文件夹 c 我想找到所有有两个子文件夹 c 的子文件夹 b 并输出它们 结构如下 a b1 c1 b2 c1 c2 b3 c1 c2
  • 使用项目中的波形文件

    我目前只能通过将波形文件放在已编译的 exe 旁边来播放背景声音 但我实际上想要一个包含波形文件的静态可执行文件 这在Delphi XE2中可能吗 这是我的代码 SndPlaySound Raw wav SND ASYNC or SND L
  • 如何使用 Gmail 的 SMTP 和 Indy 10 发送电子邮件?

    我正在使用 Delphi 2009 和 svn 中最新的 Indy 10 通过 SMTP 发送电子邮件 但它不适用于 Gmail Google Apps 托管域 当我尝试发送电子邮件时 我收到 必须首先发出 STARTTLS 命令 我尝试用
  • 如何使用我在 github 中发布的 bash 脚本执行 chsh?

    我有一个要点 我总是用它来在新服务器上安装我需要的软件包 http gist github com 4372049 http gist github com 4372049 我需要做的就是通过 ssh 在新服务器中输入以下内容 bash c
  • 拆分字符串以仅获取前 5 个字符

    我想去那个地点 var log src ap kernelmodule 10 001 100 但看起来我的代码必须处理 ap kernelmodule 10 002 100 ap kernelmodule 10 003 101 等 我想使用
  • Delphi 2010 - 从 XML 文档解码 Base64 编码图像

    我正在尝试从应用程序中的 XML 文档解码 base64 编码的 EMF 图像并将其呈现在屏幕上 但是 它似乎从未出现 如果我将 XML 文档中的数据复制 粘贴到 Notepad 中并使用Base64 Decode选项并将文件另存为 emf
  • 使用 find - 删除除任何一个之外的所有文件/目录(在 Linux 中)

    如果我们想删除我们使用的所有文件和目录 rm rf 但是 如果我希望一次性删除除一个特定文件之外的所有文件和目录怎么办 有什么命令可以做到这一点吗 rm rf 可以轻松地一次性删除 甚至可以删除我最喜欢的文件 目录 提前致谢 find ht
  • 防止多个实例 - 但还要处理命令行参数?

    我正在从我的应用程序处理与 Windows 相关的扩展文件 因此 当您在 Windows 中双击文件时 它将执行我的程序 然后我从那里处理该文件 如下所示 procedure TMainForm FormCreate Sender TObj
  • 使用 posix shell 测试字符串中的正则表达式

    如何测试字符串是否与特定字符串匹配正则表达式与基本 无 bash 或任何其他 posix shell 脚本 在 if 语句中 您可以使用expr在 POSIX shell 中计算正则表达式的命令 s Abc expr s alpha 3 e
  • shell脚本中的\r字符

    我在尝试执行 shell 脚本时收到以下错误 r command not found line 2 请提出同样的解决方案 以下是脚本中使用的初始行 bin sh if lt 1 then echo ERROR Environment arg
  • 如何在bash中使用jq从变量中包含的json中提取值

    我正在编写一个 bash 脚本 其中存储了一个 json 值 现在我想使用 Jq 提取该 json 中的值 使用的代码是 json val code lyz1To6ZTWClDHSiaeXyxg redirect to http examp
  • 如何在 shell 脚本中并行运行多个实例以提高时间效率[重复]

    这个问题在这里已经有答案了 我正在使用 shell 脚本 它读取 16000 行的输入文件 运行该脚本需要8个多小时 我需要减少它 所以我将其划分为 8 个实例并读取数据 其中我使用 for 循环迭代 8 个文件 并在其中使用 while
  • 如何在数组中存储包含双引号的命令参数?

    我有一个 Bash 脚本 它生成 存储和修改数组中的值 这些值稍后用作命令的参数 对于 MCVE 我想到了任意命令bash c echo 0 0 echo 1 1 这解释了我的问题 我将用两个参数调用我的命令 option1 without
  • 如何在 Linux shell 中将十六进制转换为 ASCII 字符?

    假设我有一个字符串5a 这是 ASCII 字母的十六进制表示Z 我需要找到一个 Linux shell 命令 它将接受一个十六进制字符串并输出该十六进制字符串代表的 ASCII 字符 所以如果我这样做 echo 5a command im

随机推荐

  • NSView 子类中的鼠标单击事件

    我有一个 NSView 子类 它使用 OpenGL 上下文进行初始化 并具有一堆鼠标事件处理 onMouseDown 等 我有一个使用它的应用程序 它有一个包含视图的主 Cocoa 窗口 并且所有鼠标事件都正常工作 但是 我现在尝试在另一个
  • 自动调整 UICollectionView 高度以适应其内容大小

    我有一个 UICollectionView 一个在集合视图中创建新单元格的按钮 我希望 UICollectionView 根据其内容大小调整其大小 当有一两个单元格时 UICollectionView 很短 如果有很多单元格 UIColle
  • 对话框服务内容中的换行符被忽略

    在剑道对话服务窗口的内容中插入换行符 rogress 中的 Kendo Angular 6 对话框 换行符将被忽略 尝试了 html 元素 br 和 n n 例如它在连续一行中显示字符文本 n n n const dialog Dialog
  • 如何向 CRM 2011 进行身份验证?

    我想建立一个简单的网站 客户可以在其中下订单和查看产品 此数据是我的 Microsoft Dynamics CRM 2011 环境 该数据是特定于客户的 因此我需要有关登录用户的信息 用户凭据存储在 CRM 2011 中 使用这些凭据 用户
  • Jython 的内存限制

    如何为我的 Jython 程序设置 JVM 内存限制 Java 的 Xmx 选项 我明白 Jython2 5引入 J 选项以便将选项发送到 JVM jython J Xmx8000m 但是 我必须与java1 6 0 23 上的 Jytho
  • android OAuth-2.0 google 使用 webview 登录获取用户信息

    我正在创建允许用户使用 facebook 或 google 帐户登录的应用程序 他们按下 登录 按钮 然后系统会要求他们使用 facebook 或 google 登录 当他们选择其中之一时 会弹出网络视图 问题是谷歌身份验证 阅读了一些文章
  • 清理带有标题的 URL 的最佳方法是什么

    清理 URL 的最佳方法是什么 我正在寻找这样的网址 什么是最好的头痛药物 我当前的代码 public string CleanURL string str str str Replace str str Replace str str R
  • 在不知道 T 类型的情况下获取 Task 的结果 [重复]

    这个问题在这里已经有答案了 我正在开发一个 C 系统 一个类有一个返回 a 的函数System Threading Tasks Task对象并具有属性System Type返回类型 当 ReturnType 为 null 时 我知道该方法返
  • Python 中的 MySQL 连接器不允许 LOAD DATA INFILE 语法

    我正在尝试将文本文件发送到 MySQL 数据库 我正在尝试使用 python 3 2 中的 mysql 连接器来执行此操作 问题与 LOAD DATA INFILE 语法有关 你可以在上面找到我的代码 我的第一个问题是有没有办法解决这个问题
  • Android:使用 Intent setResults 来回传递数据

    我正在为 Android 创建一个基于 GPS 的应用程序 有 2 个活动 Main 和 LocNames Main 显示我的地图 LocNames 是获取用户想要的源和目的地 我想在用户从菜单中选择 LocNames 时启动 LocNam
  • Tensorflow 2.0 和 Java API

    注意 我已经解决了我的问题并将代码发布在底部 我正在使用 TensorFlow 后端处理必须在 Java 中进行 我从 中取出了其中一个模型https developers google com machine learning crash
  • 如何为异步方法编写单元测试用例?

    我想通过模拟依赖项来编写单元测试用例 整体流程如下 我们有一个WorklistLoader它有一个异步方法LoadWorklistItemsAsync 为了完成这个任务WorklistLoader依赖于下层 API 我想模拟 QueryMa
  • 在不处于编辑模式时对 tableView 中的行重新排序[重复]

    这个问题在这里已经有答案了 在我的应用程序中 我已经实现了重新排序行的选项 但我使用默认的编辑按钮来显示删除按钮和三行图标来移动行 但我见过一个iOS应用程序允许用户直接移动行 而不需要进入编辑模式 我将不胜感激任何建议来实现这种方式 以允
  • linux 补丁忽略行号

    我有一个产品 例如版本 1 并且对其进行了一些自定义更改 例如版本 1 x 我正在对这些版本运行差异并创建补丁文件 现在该产品有更高版本 例如版本 2 我希望将从版本 1 和版本 1 x 创建的补丁应用于版本 2 这里的困难在于行号不会保持
  • Java 线程:解释正在运行的 JVM 的线程状态

    Java 线程始终处于以下十种状态之一 NEW Just starting up i e in process of being initialized NEW TRANS Corresponding transition state no
  • 从 mp3/ogg 中剪切精确的时间范围

    我在 CDN 上有一堆音频文件 这些是并行的 mp3 和 ogg vorbises 这些文件每个都值得播放大约一小时 我需要从这些文件中提取任意部分 我得到一个文件名 我可以选择是否使用 mp3 或 ogg 版本 和两个时间戳 并且我需要恰
  • 计算iTextSharp PDF文档的高度?

    使用iTextSharp时如何计算PDF文档的高度 我正在使用 iTextSharp 使用绝对位置在 PDF 文档上定位各种图像 不过我注意到了SetAbsolutePosition 定位Y参数来自底部 所以我需要计算高度才能执行以下操作
  • MongoDB MapReduce是否锁定数据库

    MongoDB MapReduce 作业是否会锁定数据库 我正在开发一个多用户 MongoDB Web 应用程序 并且担心多用户冲突和性能 有人能给我一些至理名言吗 简单的回答 有时 这在很大程度上取决于您如何使用map reduce 但根
  • Electron:删除 beforeunload 事件监听器

    我有一个电子应用程序 用于显示我无法控制的网页 该应用程序的使用是为了每隔几秒钟就可以显示一个不同的页面 显示的页面之一附加了一个 beforeunload 监听器 如下所示 window addEventListener beforeun
  • 如何获取winexec或shellexecute中执行的Handle?

    我用来创建像 winexec Hand 这样的自定义函数 它将返回执行的应用程序的句柄 我确实使用了 findwindow 但如果它更改窗口标题就会出现问题 没有一种通用方法可以获取应用程序的 该 窗口句柄 因为不能保证任何程序都有一个窗口