这就是我所拥有的:用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
似乎不适用于此。
答案 0 :(得分:0)
你很可能无法从插件中获得C#应用程序的能力,因为插件进程也不是前台进程 - 它实际上是在不同的进程中运行,至少在几个可用的浏览器上运行。在IE上,你不是,但是你处于一个低完整性的过程,所以你自己启动这个过程require a registry entry指定启动该应用程序是可以的。
我必须同意你的观点 - 我认为你已经尝试了所有合法的方法,但这是不可能的。哎呀,即使是最近版本的windows,安装人员也常常会在后台打开重要的窗口。