虚拟桌面原理及实现

A00553344 2009-02-02 01:39:45
加精
虚拟桌面原理及实现
blog: http://blog.csdn.net/A00553344/archive/2009/02/02/3858216.aspx

文章作者:不赖猴 2009-02-02

一、为什么要使用虚拟桌面。



场景一、

上班的时候,我们经常会趁老板不注意,去一些工作时间不应该去的网站,或是运行一些不应该运行的程序,比如一些聊天工具,小游戏,股票软件等等。而且,经常会打开一大堆。当老板或其他同事来到你的桌前的时候,你正在手忙脚乱的关着这些程序,而且,还来不及保存想要保存的东西。



场景二、

在你给别人做讲演的时候,需要在电脑桌面上展示很多资料。当然一个桌面经常是远远不够展示的,而且,需要经常的切换画面,由于打开的资料太多,每次还的任务栏里找上一阵。很影响讲演的流畅性。



虚拟桌面程序就是用来解决以上的问题。

场景一、

你可以用虚拟桌面程序同时生成多个桌面。一个桌面打开着你工作的资料,程序等等。一个桌面打开着你的聊天工具及一些你不想别人看到的东西。当然你还可以用一个桌面放一些你想访问的网站啊,股票信息啊等等。剩下的只是简单的按一下快捷键来切换不同的桌面。



场景二、

同场景一,你可以用虚拟桌面程序生成多个桌面,把要讲演的资料提前分配到多个桌面。剩下的只是简单的按一下快捷键来切换不同的桌面。



二、虚拟桌面实现原理



1. 原理概况



每次开机的时候,我就创建多个桌面,然后定时监控快捷键(Ctrl+数字键),如果有快捷键被按下,就切换到数字键对应编号的桌面。



2.什么是桌面?



每一个运行着Window NT 的系统中都有一个Window 工作站对象,这个对象是安全对象的第一层,是所有用户安全对象的继承之源,每一个Window 工作站对象可以拥有一些桌面对象,每一个桌面都拥有一个窗口链。窗口链里存放着显示在所属桌面的各种窗口。Window NT 用了两个桌面窗口对象,一个是用来处理登陆界面、屏蔽、锁住工作站等,一个是我们登陆之后进来操作的窗口了。

Window NT通过"explorer.exe"进程来管理这个桌面对象。这就是为什么我们在任务管理器里杀掉"explorer.exe",我们的桌面就会消失的原因。



3.创建一个桌面。



function CreateANewDesktop(DesktopName: string): Boolean;

var

sin : TStartupInfo;

pin : TProcessInformation;

hDesk : HDESK;

begin

result := false;

hDesk := CreateDesktop(PChar(DesktopName),nil,nil,0,MAXIMUM_ALLOWED,nil);

try

FillChar(sin,SizeOf(sin),0);

sin.cb := SizeOf(sin);

sin.lpDesktop := PChar(DesktopName);

CreateProcess(PChar(WindowDirectory+'explorer.exe'),nil,nil,nil,False,0,nil,nil,sin,pin);

Sleep(2000);

result := true;

finally

CloseDesktop(Desk);

end;

end;



4.查询当前已经存在的桌面。



枚举桌面的API是EnumDesktops.

BOOL EnumDesktops(
HWINSTA hwinsta, // 当前的WindowsStation句柄
DESKTOPENUMPROC lpEnumFunc, // 回调函数,由系统调用。
LPARAM lParam //传递给回调函数的参数指针
);
通常我们定义个一回调函数,定义一个全局TStringList类对象,在回调函数里将枚举到的桌面的名称增加到TStringList里。



var

sttopList : TStringList;



function EnumDesktopProc(Desktop: LPTSTR; Param: LParam): Boolean; stdcall;
begin
if (Desktop<>'Winlogon') and (Desktop<>'Disconnect') then

DesktpList.Add(DeskTop);

result := True;
end;



procedure EnumerateDesktops;
begin
EnumDesktops(GetProcessWindowStation, @EnumDesktopProc, nil);
end;





5.切换桌面。



procedure DesktopSwitch(DesktopName: String);
var hDesk: HDESK;
begin
hDesk:=OpenDesktop(PChar(DesktopName), DF_ALLOWOTHERACCOUNTHOOK, False, MXIMUM_ALLOWED);
Sleep(100);
SwitchDesktop(hDesk);
CloseDesktop(hDesk);
end;





三、结束语



你可以把这个虚拟桌面程序做成一个服务,每次开机就自动加载。这样,你就可以每次都拥有多个桌面了。



附件release.rar是运行程序,无须安装。
http://d.download.csdn.net/down/985557/A00553344
...全文
5635 110 打赏 收藏 转发到动态 举报
写回复
用AI写文章
110 条回复
切换为时间正序
请发表友善的回复…
发表回复
van163 2012-04-25
  • 打赏
  • 举报
回复
非常棒,学习一下。
wkwkkk 2011-08-04
  • 打赏
  • 举报
回复
顶了!!太棒了 、、只可惜我不懂delphi...呵呵
nana20082009abc 2011-08-02
  • 打赏
  • 举报
回复
好东西 学习下
cnotes 2010-09-07
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
感觉非常好,非常欣赏!
rulioo 2010-07-09
  • 打赏
  • 举报
回复
不错的人说。
tiger_ok1 2009-12-31
  • 打赏
  • 举报
回复
学习
netehoney 2009-10-10
  • 打赏
  • 举报
回复
heikeyanxi 2009-05-23
  • 打赏
  • 举报
回复
收藏 学习
ysgs129 2009-04-11
  • 打赏
  • 举报
回复
xuexi
DFans 2009-04-07
  • 打赏
  • 举报
回复
学习了
锦官 2009-04-07
  • 打赏
  • 举报
回复
谢谢,学习了。
linghengmao 2009-03-20
  • 打赏
  • 举报
回复
delphi的牛人还真不少!学习了。
bob008 2009-03-20
  • 打赏
  • 举报
回复
用来看A片可就太强悍了
chys3584 2009-03-14
  • 打赏
  • 举报
回复
好贴子,谢谢分享。
imkeby 2009-03-14
  • 打赏
  • 举报
回复
不错 收藏下
YFLK 2009-03-14
  • 打赏
  • 举报
回复
顶起来,是个好帖子
okmnji79513 2009-03-05
  • 打赏
  • 举报
回复
学习学习 mark mark 不顶对不起这么好的帖子啊
zpxfzp 2009-02-28
  • 打赏
  • 举报
回复
d
bob008 2009-02-28
  • 打赏
  • 举报
回复
这么好的帖子必须顶啊
加载更多回复(90)

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧