我对微软的世界有点新鲜。 我已经阅读了这个答案和许多其他的链接,我知道,Vista后,windows服务不能与桌面交互。
不过,我有一个紧急情况,我必须快速find解决方法。 我需要我的windows服务以某种方式打开一个URL的浏览器(任何一种丑陋的黑客现在会做)。 答案是:
您需要编写一个单独的代理应用程序,该应用程序将在用户login时自动启动,并与您的服务进行通信。 然后代理可以启动浏览器或做任何你需要的东西。
有人可以向我解释我怎么可以用简单的方法做到这一点? 那个服务怎么会跟这个“代理”对话呢? 这个“代理”究竟是什么?
windows *** 作系统体系结构书
dynamic识别控件的容器(GroupBox等)
导入基于64位或32位 *** 作系统的外部DLL
如何通过索引访问数据中继器的项目而不是显式名称?
以编程方式更改播放设备xp
任何链接或build议将不胜感激。
编辑:目前。 我的服务试图运行以下代码: System.Diagnostics.Process.Start("www.Google.com");
我后来发现,这是行不通的
有没有办法通过局域网caching和分发Visual Studio更新?
.NET(C#):当你只有一个进程句柄或PID时获取子窗口?
C# – 文件path的正则Expression式,例如C: test test.exe
自行终止或卸载windows服务
一个服务附加到另一个截断文件
恐怕没有“快捷方式”来做到这一点。 (由于服务不能与用户的桌面交互,即使可以启动浏览器,用户也无法看到它。)
你所提到的“代理应用程序”是一个完全独立的应用程序,它在登录时在用户桌面下运行。 它将不得不使用一些进程间通信的方法(命名管道,TCP / IP等)来与服务进行通信。
服务不与桌面交互的原因是出于安全原因。 没有“快速解决方法”可用,不应该有一个。 也没有什么“简单的方法”来规避这种变化(而且,不应该有 – 如果你能以简单的方式绕过安全,那么安全性就不大)。
是的,从一个服务,你可以在桌面上运行代码…问题是在哪个桌面上? 因为可能有多个用户同时登录(例如,在windows server中可能有多个远程登录的用户)。
如果在你的例子中使用了一个服务的Process.Start :
System.Diagnostics.Process.Start("www.Google.com");
该程序不会出现在任何用户的桌面上,因为该服务不与任何用户的桌面相关联。
解决方案是检测哪个用户在本地登录,然后以该用户的身份(以及该用户的权限)执行该程序。 为此,我想链接到我的另一个答案 ,我演示了如何从服务调用程序。 在这个答案中,我提出了这种技术所需的代码 。
注意 :这个答案是关于屏幕截图的,我所描述的技术仍然是在用户的会话中调用一个程序,而这个方法是从一个服务开始的。 所以这适用于你的问题。
您可以使用此方法直接执行所需的浏览器。 作为替代方案,您可以使用它来调用服务可执行文件,您可以在其中使用System.Environment.UserInteractive检测可执行文件是否不作为服务运行。 如果您将url作为执行参数传递给您的服务可执行文件,那么您可以使用Process.Start与上面的示例一样使用默认浏览器打开它。
注意 :代码在windows 7上进行了测试。
如果你需要紧急的东西 – 我会尝试从服务中把消息放入MSMQ,然后写一些简单的等待队列消息的客户端,然后继续。
更新:
实际上,如果你需要的东西很快 – 你甚至可以写一些文件,并编写简单的桌面(winforms?)应用程序来读取池中的文件(每5秒?),并在需要时打开浏览器。
使用shellexecute使用pinvoke http://www.pinvoke.net/default.aspx/shell32.shellexecute
C# Signature: public enum ShowCommands : int { SW_HIDE = 0,SW_SHOWnorMAL = 1,SW_norMAL = 1,SW_SHOWMINIMIZED = 2,SW_SHOWMAXIMIZED = 3,SW_MAXIMIZE = 3,SW_SHOWNOACTIVATE = 4,SW_SHOW = 5,SW_MINIMIZE = 6,SW_SHOWMINNOACTIVE = 7,SW_SHOWNA = 8,SW_RESTORE = 9,SW_SHOWDEFAulT = 10,SW_FORCEMINIMIZE = 11,SW_MAX = 11 } [Dllimport("shell32.dll")] static extern IntPtr ShellExecute( IntPtr hwnd,string lpOperation,string lpfile,string lpParameters,string lpDirectory,ShowCommands nShowCmd); // Asks default mail clIEnt to send an email to the specifIEd address. ShellExecute( IntPtr.Zero,"open","mailto:support@microsoft.com","",ShowCommands.SW_SHOWNOACTIVATE ); // Asks default browser to visit the specifIEd site. ShellExecute( IntPtr.Zero,"http://channel9.msdn.com",ShowCommands.SW_SHOWNOACTIVATE ); // Opens default HTML editing app to allow for edit of specifIEd file ShellExecute( IntPtr.Zero,"edit",@"c:file.HTML",ShowCommands.SW_SHOWNOACTIVATE ); //ModifIEd by Aljaz: Replaced the last zero in these calls with 4 otherwise it wouldn't show anything // 0 stands for SW_HIDE contant,which means execute but don't show the window which is probably not // what we want.
总结以上是内存溢出为你收集整理的从Windows服务启动浏览器全部内容,希望文章能够帮你解决从Windows服务启动浏览器所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)