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