AllowSetForegroundWindow& SetForegroundWindow:NPAPI插件希望允许桌面应用程序无法成功

时间:2012-09-07 18:56:58

标签: c# windows winapi npapi

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

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

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

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

看完之后:

  

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

我决定修改插件。

这次插件调用AllowSetForegroundWindow函数传递ASFW_ANY作为参数(我知道,ASFW_ANY可能存在风险,但我想确保{{1}会做的。)

在我对插件进行了修改之后,我测试了它并且它工作了! (歌剧12.02)。然后我在Internet Explorer上测试它,它也工作。但是当我在Firefox和Chrome中测试它时出现问题。 C#应用程序无法将记事本带到前台。我注意到,对于那些浏览器,AllowSetForegroundWindow函数返回false。

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

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

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

1 个答案:

答案 0 :(得分:0)

你很可能无法从插件中获得C#应用程序的能力,因为插件进程也不是前台进程 - 它实际上是在不同的进程中运行,至少在几个可用的浏览器上运行。在IE上,你不是,但是你处于一个低完整性的过程,所以你自己启动这个过程require a registry entry指定启动该应用程序是可以的。

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