虚拟桌面原理及实现
来源:互联网 发布:python lambda 编辑:程序博客网 时间:2024/05/20 02:30
作者:摘自http://blog.csdn.net/A00553344/article/details/3858216
虚拟桌面实现原理
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;
升级功能
你可以把这个虚拟桌面程序做成一个服务,每次开机就自动加载。这样,你就可以每次都拥有多个桌面了。
- 虚拟桌面原理及实现
- 虚拟桌面原理及实现
- 虚拟桌面原理及实现
- 虚拟桌面原理及实现
- C#实现虚拟桌面
- 虚拟桌面简单实现
- ARM920T虚拟地址原理分析及实现
- ARM虚拟地址原理分析及实现
- MFC实现虚拟桌面(桌面切换)
- vpn原理及实现--虚拟网卡构建vpn
- 感谢生活--vlink虚拟链路的实现及原理
- 感谢生活--vlink虚拟链路的实现及原理
- vpn原理及实现--虚拟网卡构建vpn
- vpn原理及实现--虚拟网卡构建vpn
- vpn原理及实现--虚拟网卡构建vpn
- vpn原理及实现--虚拟网卡构建vpn
- vpn原理及实现--虚拟网卡构建vpn
- 虚拟继承实现原理
- 如何代码安装驱动?
- Wince中为元件注册鼠标事件以实现Canvas中的拖拽效果
- C# 串口在关闭时候死锁的解决方法
- 极其无聊的 StrtoDate 失败
- oracle的学习(各种摘抄)
- 虚拟桌面原理及实现
- hust1601 校赛
- 怎样控制其他程序窗体上的窗口控件
- 粗制滥造的平板电脑键盘皮套
- MSComm的属性、事件及方法
- 为什么TIdTcpClient总是无法接收服务器发来的数据?
- TidTcpClient总结
- Delphi中使用SetLength分配的动态数组空间在越界赋值后出现invalid pointer operation异常
- TeeChart7 Pro中FastLine最多可添加的点数