虛拟桌面技术的初步探讨.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
虛拟桌面技术的初步探讨

【文章标题】: 虚拟桌面技术的初步探讨?? 【文章作者】:??newjueqi?? 【作者邮箱】:?zengjiansheng1@126.com 【作者QQ号】:?190678908 【编写语言】:VC++6.0 【操作平台】:?XP-SP2 【作者声明】: 这几天研究了虚拟桌面技术,感觉到这是一种非常有意思的技术,这篇就当成是学习笔记吧!本人只是感兴趣,没有其它目的,失误之处敬请给位大侠原谅! 什么是桌面? 每一个运行着Window NT 的系统中都有一个Window 工作站对象,这个对象是安全对象的第一层,是所有用户安全对象的继承之源,每一个Window 工作站对象可以拥有一些桌面对象,每一个桌面都拥有一个窗口链。窗口链里存放着显示在所属桌面的各种窗口。Window NT 用了两个桌面窗口对象,一个是用来处理登陆界面、屏蔽、锁住工作站等,一个是我们登陆之后进来操作的窗口了。 Window NT通过explorer.exe进程来管理这个桌面对象。这就是为什么我们在任务管理器里杀掉explorer.exe,我们的桌面就会消失的原因。CreateDesktop(),函数声明如下 HDESK CreateDesktop( LPCTSTR lpszDesktop, // 新桌面的名称 LPCTSTR lpszDevice, // 为NULL LPDEVMODE pDevmode, // 为NULL DWORD dwFlags, // 指定应用程序在桌面的兼容方式 ACCESS_MASK dwDesiredAccess, // 指定新桌面的权限 LPSECURITY_ATTRIBUTES lpsa //指定句柄是否能被继承 ); 返回值是新创建的桌面的句柄。 那么新建了一个桌面后,怎么在这个新的桌面上运行程序呢?先不要着急,我们先来回顾一下创建进程的函数CreateProcess(),在这个函数的参数中StartupInfo中有 lpDesktop这么一个属性,如果这个属性为NULL则在当前的桌面创建线程,如果指定了桌面的名称,则进程将会在指定的桌面上启动,所以想在创建的新桌面里初始化一些程序,只要把lpDesktop参数指定为新桌面的名称即可。 另外也有一个简单的方法可把新的线程挂在新创建的桌面下,就是使用API函数SetThreadDesktop(),声明如下: BOOL SetThreadDesktop( HDESK hDesktop // 指向指定的桌面句柄 ); 但使用这个函数要注意一点,根据MSDN的说法:The SetThreadDesktop function will fail if the calling thread has any windows or hooks on its current desktop (unless the hDesktop parameter is a handle to the current desktop) 意思就是除非要指定的桌面句柄是当前的桌面,不然的话这个函数的调用会失败如果当前线程拥有任何的窗口(即UI界面). 怎么实现不同桌面之间的切换呢? 要在不同的桌面之间切换,可用API函数SwitchDesktop,声明如下: BOOL SwitchDesktop( HDESK hDesktop // 桌面的句柄 ); 另外也可通过点击“切换”按钮实现桌面的切换。 但又引申出一个新的问题,必须要知道各个桌面的句柄,获取桌面的句柄可通过API函数GetThreadDesktop,函数的声明如下: HDESK GetThreadDesktop( DWORD dwThreadId //线程的ID); 返回值就是指定线程所在的桌面了。 而且我们必须要认清一点事实,就是创建新桌面的线程启动是在旧的桌面上,所以可以用下面的语句轻松获得当前桌面的句柄: GetThreadDesktop(GetCurrentThreadId()); 返回值就是旧的桌面句柄。 怎么关闭新创建的桌面? 这个问题其实也不用我们担心,微软已经替我们想好了^-^ , 用CloseDesktop函数可轻松实现这个功能,函数声明如下: BOOL CloseDesktop( HDESK hDesktop // 指定要关闭的桌面的句柄 ); 下面贴一段代码的例子,是在新创建的桌面上运行计算器(calc.exe)实现计算器的后台运行 #include windows.h HINSTANCE hInst;

文档评论(0)

sd47f8cI + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档