如果我有作业窗口之一的句柄,如何获取作业句柄
我的应用程序尝试抓取 IE8,在这里我们以某种方式获取 Internet Explorer 窗口/UI 的句柄。现在我想获取 IE8 的作业句柄。 一个想法是—— 首先使用 GetWindowThreadProcessId() 使用 IE 窗口句柄确定进程 ID,但此后我陷入困境。
IE8 中有新的实现,这里打开的每个选项卡都是作业中的一个进程。因此我们看到的 IE8 是作为一项工作来管理的。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我找不到任何有记录的方法来获得流程所绑定的工作;另外,我找不到任何记录的方法来枚举系统中的所有作业,除了 WMI 方式 但仅适用于 XP 及以上版本(我认为这不是问题,因为您的目标是 IE8 )并且仅适用于命名作业(如果 IE8 使用匿名作业对象,这实际上可能是一个问题)。
如果 IE 的工作在此列表中,那么这条路就是下坡路:只需使用 OpenJobObject 在您可以获得的每个作业名称上(或者,如果您通过作业名称的一些启发式方法来缩小工作范围,那就更好了)并且使用 IsProcessInJob 检查您的进程句柄(通过 OpenProcess + GetWindowThreadProcessId) 属于该作业;一旦你找到了比赛,你就准备好了。请记住关闭所有这些句柄! :)
如果不幸的是 IE8 使用的作业对象是未命名的,那么整个事情就会变得更加困难。您可能需要诉诸几乎未记录的(由 Microsoft,但在网上广泛记录的)句柄枚举技术来枚举与目标进程相关的所有句柄。然后,您可以仅过滤掉作业对象句柄,并使用上述技术来获取正确的对象。
By the way, why do you need to access the job objects used by IE8?
I couldn't find any documented way to get the job to which a process is bound; also, I couldn't find any documented way to enumerate all the jobs in the system, except the WMI way that however works only from XP onwards (which I don't think it's a problem since you're targeting IE8) and only with named jobs (which may actually be a problem if IE8 uses anonymous job objects).
If IE's jobs are in this list, then the road is downhill: just use OpenJobObject on each job name you can get (or, if you manage to narrow down your work with some heuristic on the job names, even better) and use the IsProcessInJob to check if your process handle (which you get with OpenProcess + GetWindowThreadProcessId) belongs to the job; once you get a match, you're set. Remember to close all those handles! :)
In the unfortunate event that the job objects used by IE8 are unnamed, then the whole thing becomes more difficult. You probably need to resort to almost-undocumented (by Microsoft, but widely documented on the net) handle-enumeration techniques to enumerate all the handles relative to your target process. You can then filter out just the job objects handles, and use the technique described above to get the right one.
By the way, why do you need to access the job objects used by IE8?