【问题标题】:Showing a hidden process on Windows?在 Windows 上显示隐藏进程?
【发布时间】:2009-05-19 17:51:53
【问题描述】:

我遇到了一点问题。

与我之前关于Slipstreamed SP3 vs. patched SP3 的问题有关,我们得出的结论是,有一个 Internet Explorer 进程正在启动,被指示从本地磁盘加载一个简单的 .html 文件,其中包含 javascript,它会打开更大的聊天/会议系统的其余部分。 Internet Explorer 从 Lotus Notes 客户端启动。

不幸的是,我们只能看到 IExplore.exe 进程在任务管理器中弹出,几秒钟后又消失了。

如果我们尝试打开在磁盘上找到的本地 .html 文件,它会在顶部显示信息栏,告诉我们它已禁用活动内容。然而,这并不是真正的问题。我们有另一台具有相同设置但一切正常的机器,手动加载 .html 文件也会给我们同样的错误。

但是,从notes启动IExplore时可能会显示另一条错误消息,但是由于这个过程应该只是启动系统的其余部分,而这个窗口是隐藏的,我们看不到它,即,错误信息/问题。

所以,我想,也许我应该尝试创建一个小程序,等待 IExplore.exe 启动,然后立即显示窗口,以便我们可以看到错误消息或任何问题。至少,希望我们能够看到这一点。

到目前为止一切都很好,除了如果我从我自己的程序启动一个带有隐藏窗口的进程,主窗口句柄为 0,因此我根本无法显示该窗口。我希望这个从 Lotus Notes 启动的 IExplore.exe 进程也有同样的问题。

我的监控程序是用C#写的,基本上就是这样循环运行的:

foreach (var process in Process.GetProcesses())
{
    if (process.ProcessName.ToLower() == "iexplore")
        result.Add(process);
}

这会拾取所有 IExplore.exe 进程,无论是否有窗口,并且使用 IE8,我得到第一个窗口的 2 个进程,正如预期的那样。我一遍又一遍地运行它,并处理与以前运行的差异。

但是,该进程在开始时短暂地有一个窗口句柄 0,所以我将其更改为:

foreach (var process in Process.GetProcesses())
{
    if (process.ProcessName.ToLower() == "iexplore" &&
        process.MainWindowHandle != IntPtr.Zero)
    {
        result.Add(process);
    }
}

但现在它根本没有拾取任何东西,即使在窗口获得句柄之后(是的,在窗口显示后 process.MainWindowHandle 确实有一个非零句柄值,但是在窗口从不显示,它保持在 0。)

所以,问题是:我有什么办法可以利用这个隐藏的 IExplore.exe 进程,并在它还没有窗口句柄时指示它显示自己?我对此表示怀疑,但也许有人可以证明我错了。

如果没有,我的备份计划是创建一个 shim IExplore.exe 程序,它将所有命令行参数转发给原始的,除了它指定要显示的窗口。这会是一个解决方案吗?

【问题讨论】:

    标签: c# process window hidden show


    【解决方案1】:

    我不相信有任何方法可以强制没有窗口句柄的 IE 窗口为自己分配一个窗口句柄(或使用以前分配的一个)并显示自己。

    至于您的备份方法:我认为这可行,但您在危险区域工作。实际上,我建议您编写 shim 以记录 iexplore.exe 的每次调用以及其中的所有内容,并使用它来描述您的问题;只有在用完全良性的日志记录彻底描述您的问题后,我才会建议可能修改参数以强制 iexplore.exe 显示一个窗口。

    【讨论】:

    • 这完全是一个调试工具,这样糟糕的解决方案不可能投入生产,所以现在我们将使用 shim 选项看看是否有帮助。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-30
    • 2017-06-11
    • 1970-01-01
    • 2011-12-24
    • 2018-02-01
    相关资源
    最近更新 更多