【问题标题】:How to get job handle if I have HANDLE to one of the windows of the job如果我对工作的一个窗口有 HANDLE,如何获得工作句柄
【发布时间】:2010-07-07 09:23:25
【问题描述】:

我的应用程序试图抓取 IE8,在这里我们以某种方式获得了 Internet Explorer 窗口/UI 的句柄。现在我想获得 IE8 的工作句柄。 一个想法是—— 首先使用 IE Window HANDLE 使用 GetWindowThreadProcessId() 确定进程 ID,但之后我被卡住了。

IE8 中有一个新的实现,这里打开的每个选项卡都是作业中的一个进程。因此我们看到的 IE8 是作为一个作业来管理的。

【问题讨论】:

  • 对于与抓取相关的工作,您无能为力。

标签: windows winapi process jobs


【解决方案1】:

我找不到任何记录在案的方法来获取绑定到进程的作业;此外,除了WMI way 之外,我找不到任何记录在案的方法来枚举系统中的所有作业,但它只能从 XP 开始工作(我认为这不是问题,因为你的目标是 IE8)并且只有使用命名作业(如果 IE8 使用匿名作业对象,这实际上可能是一个问题)。

如果 IE 的工作在这个列表中,那么这条路就走下坡路了:只需在您可以获得的每个工作名称上使用 OpenJobObject(或者,如果您设法通过对工作名称的一些启发式方法来缩小工作范围,那就更好了) 并使用IsProcessInJob 检查您的进程句柄(通过OpenProcess + GetWindowThreadProcessId 获得)是否属于该作业;一旦你得到一个匹配,你就设置好了。记得关闭所有这些句柄! :)

万一 IE8 使用的作业对象没有命名,那么整个事情就变得更加困难了。您可能需要求助于几乎未记录(由 Microsoft,但在网络上广泛记录)的句柄枚举技术来枚举与您的目标进程相关的所有句柄。然后,您可以只过滤掉作业对象句柄,并使用上述技术来获得正确的句柄。


顺便问一下,为什么需要访问 IE8 使用的作业对象?

【讨论】:

  • 不幸的是,IE8 使用未命名的对象。我将从进程 ID 中获取进程名称。 - 弄清楚这将始终是 iexplore.exe,然后枚举具有相同名称的所有进程,以便它们具有相同的父进程。再次需要在所有相关流程中获取最新流程 - 弄清楚仍然感谢您的回复
  • IE8 将在此作业中将每个新选项卡作为子进程启动。即使一个人启动了一个新实例(当一个实例已经打开时)也会作为这个作业的子进程运行。我想废弃这些子进程/选项卡之一...以获取该进程 ID .. 作业详细信息将很有用。我正在研究...解决此问题的另一种方法
  • 不客气;如果您认为它们有用,请支持我的回答:)。顺便说一句,我也认为获得工作对象不会帮助您完成任务; “废弃这些子进程之一”到底是什么意思?
猜你喜欢
  • 1970-01-01
  • 2010-09-21
  • 1970-01-01
  • 2013-02-10
  • 1970-01-01
  • 1970-01-01
  • 2011-08-12
  • 1970-01-01
  • 2022-10-25
相关资源
最近更新 更多