1

这就是我所拥有的:一个用 C++ 编写的 Web 浏览器插件和一个用 C# 编写的 Windows 应用程序。它们通过命名管道进行通信。该插件指示 C# 应用程序打开一个文件(假设该文件是 .txt 并在记事本中打开)。

一旦 C# 应用程序收到命令,它就会打开文件,但记事本没有显示在前台,这是不可接受的,我必须在前台打开记事本。

我修改了 C# 应用程序,以便它调用该SetForegroundWindow函数。这次记事本没有在前台打开,而是任务栏闪烁。

在阅读了SetForegroundWindow许多文章的文档后,我认为现在我明白了问题所在:C# 应用程序无法将记事本带到前台,因为它不是前台进程,浏览器是(?)。

读完后:

“一个可以设置前台窗口的进程可以通过调用AllowSetForegroundWindow函数让另一个进程设置前台窗口。”

我决定修改插件。

这次插件调用作为参数AllowSetForegroundWindow传递的函数(我知道,可能有风险,但我想确保这样做)。ASFW_ANYASFW_ANYAllowSetForegroundWindow

在我对插件进行修改后,我对其进行了测试,它确实有效!(歌剧 12.02)。然后我在 Internet Explorer 上对其进行了测试,它也可以正常工作。但是当我在 Firefox 和 Chrome 中测试它时,问题就来了。C# 应用程序无法将记事本置于前台。我注意到对于那些浏览器,该AllowSetForegroundWindow函数返回 false。

所以我开始调查,我得出的结论可能是因为 Firefox 使用的插件容器。我想到了一个想法:它在 Opera 12.02 中工作,但他们没有插件容器,虽然他们在 Opera 12.00 中有。所以我下载了 Opera 12.00,我做了测试,但它失败了,这让我得出结论,插件容器是罪魁祸首。

问题是:如何赋予 C# 应用程序设置前景的能力?

我不知道如何继续,我认为我尝试了所有合法的方式。AllowSetForegroundWindow&SetForegroundWindow似乎不适用于这里。

4

1 回答 1

0

您很可能无法通过插件为 C# 应用程序提供该功能,因为插件进程也不是前台进程——它实际上在不同的进程中运行,至少在您可用的几个浏览器上运行。在 IE 上您不是,但您处于低完整性进程中,因此您自己启动该进程需要一个注册表项,指定可以启动该应用程序。

我必须同意你的观点——我认为你已经尝试了所有合法的方法,但这是不可能的。哎呀,即使是安装程序也经常在最近版本的 Windows 中在后台打开重要的窗口。

于 2012-09-08T03:33:23.290 回答