Friends, Technology, Web2.0 - What I am reading

    [Home] [Recent] [Site Map]

   

在服务里面弹出一个窗口到用户的桌面上

曾几何时,服务里面弹出一个窗口到桌面上不再是那么地容易了:以前只要把服务设置为允许和桌面交互就可以直接在服务启动的时候,把一个窗口弹给用户。但是现在在vista(其它的OS 下没有测试,未知)下要弹出这样的窗体,首先会弹出一个提示框提示是否接否一个服务弹出来的消息,点接受后,才会在一个全灰的桌面里面弹出这个窗口。不用想,这样的用户体验,肯定是会被直接PASS。原因很简单,因为不同的用户间的桌面是不一样的,服务用的是System的权限,在vista里面是Session0,而用户的帐户不是这个(肯定大于0)。

看来,想弹出一个窗体,需要另一个程序来作辅助了。解决方案有两种:

  1. 开发一个程序A在启动的时候,随系统启动,并监控指定文件M,服务S有消息的时候,放在文件M里,A 感受了文件变化了,就去读这个文件里的内容,根据规则来作对应的动作。坏处很明显,当用户为了让系统跑得快的时候,这种自启动文件很容易被砍掉,导致了有些功能莫名奇妙地不可用。
  2. 同样地,也是开发一个程序A,用CreateProcessAsUser这个API来创建这个A ,并且发送到用户的桌面上去。好处是可以把这个A和服务S 放在同一个程序文件里面,根据不同的参数来启动不同的功能。这样用户除非是删除整个服务,否则不会有部分功能能用,又有部分功能不能用的问题。

现在来看看第二种方案,要想用CreateProcessAsUser这个API ,有这样几个步骤:

1.取得用户的令牌(Token)

2.指定好虚拟桌面

3.调用API创建这个用户进程。

在取得用户令牌的时候,又有几个方法:

1.从用户的进程上去剥

2.先用WTSGetActiveConsoleSessionId得到用户会话ID,再用WTSQueryUserToken这个API去取。

不过在vista下面,服务里面的WTSGetActiveConsoleSessionId这个API得到的总是0,也就是Session0,用这个创建出来的进程,还是属于一个服务进程。(而且这个API是XP以及以后的系统才会提供的,在早点的系统上就会调用失败)所以我们只好从用户的进程上去找,用户登录的时候,一定会有的进程就是:explorer.exe,这样可以遍历所有的进程去找到这个(如果是多人同时登录这个系统里,我也不知道该怎么办了,不知道有没有高人指点一下)。

这样创建出来的用户进程,在进程列表里面可以看到是活动用户的。但是如果在这里面使用一下文件选择框,或是去取一些系统目录,比如说用户的桌面,用户的收藏夹等,都会得到空。这时候因为没有指定用户环境造成的。使用CreateEnvironmentBlock这个API就可以搞定了。


>>Source Link
>>Blog: joycode
>>Publish Date: 5/6/2008 7:02:33 AM
>>Keywords: api vista

Related Posts
>>用.net 编码实现朗读文本的方法 #
    .Net Framework 3.0 中增加了一个命名空间:System.Speech 使用这个空间的类和方法,我们可以很方便的2行代码就可以让一段文本被读出来。 演示代码如下: using System.Speech.Synthesis; SpeechSynthesizer synth = new SpeechSynthesizer(); synth.Speak("Hello, world!你好
>>爱德凡(Aidfen):来自国内的又一款WebOS #
    爱德凡(Aidfen),来自国内的又一款网络操作系统(WebOS)于近日浮出水面。 爱德凡国内一款刚刚发布的免费、跨平台、酷似于我们使用的桌面操作系统的个人内容管理系统,内置了万年历、计算器、文件管理器、文件存储与分享等基本应用模块。 虽然我承认爱德凡(Aidfen)就目前来看仍然是一个较为粗粝的线上产品,但是作为国内鲜少的WebOS(Web Operating System)我觉得还是很有必
>>Visual C++的未来 #
    月中MSDN第九频道对Visual C++项目组的两位产品经理进行了采访。摘要如下 很多面向中小企业的应用已经转向托管开发。但是C++的历史悠久,有太多代码积累仍旧是非托管的C++,而转向托管代码的话,C++程序员喜欢用工具支持更多的C#,所以Visual C++的焦点从托管支持转向非托管支持和托管/非托管互操作。 目前的目标包括对STL/CLR的支持和编译器级别的安全性(安全STL是类库级别的)
>>Framework Design Studio发布了 #
    【原文地址】Framework Design Studio Published 【原文发表日期】04 April 08 11:17 Krzysztof Cwalina 和他的团队成员们正致力于一个工具的开发,使得框架设计者能够更简单地设计、复审与维护高度可用的API……你一定要看看这个Framework Design Studio。   我们将乐于倾听您的
>>关键字 Vista vs2003 find in files #
    虽然是小事情,不过也在这里说一下. 最近因为工作的问题,新买了一台SONY的笔记本. 现在的笔记本都是安装VISTA的, 想安装XP吧, 还找不到硬盘. 而且因为没有软驱, 所以安装时也弄不了硬盘驱动. 这个问题只好以后有空的时候解决了. 现在用VISTA安装了VS2003后, 出现了一个很严重的问题. 使用FIND IN FILES功能时, VS2003会停止响应. 上网找相关信息, 有人已经
>>Microsoft Vista Speech Recognition Tested #
    http://www.youtube.com/watch?v=KyLqUf4cdwc Really funny

Other Posts:
>>每个分类取最新的几条的SQL实现
>>4月28日链接篇: ASP.NET, ASP.NET AJAX, ASP.NET MVC, Silverlight
>>Silverlight FlickR 示例
>>InfoQ 采访:框架设计工作室(Framework Design Studio)发布了
>>ASP.NET动态数据的更新发布了
>>在代码图库(Code Gallery)中访问热修复程序(Hotfix)
>>Mesh it Up!
>>我在奥兰多ASP.NET Connections大会上做的讲座的讲义
>>使用IronRuby定义asp.net mvc路由和视图
>>【编程游戏】划拳机器人比赛
>>帮助你开发全球化的应用程序
>>Visual C++ 2008功能包发布


Month Archives:

Top Tags:
Company & Product Profiles Google Internet Technology Search feature Business and Technology Web2.0 column analysis 服务介绍 application letter comment 业界信息 news Startups deal China2.0 Search Headlines 產業策進 未來趨勢 創投 Social Network widget 創業案例 news_in 业界动态 Google/SEO SEW Experts Web 2.0 News & Ideas


@2007 All rights Reserved