每一个运行着Window NT 的系统中都有一个Window 工作站对象,这个对象是安全对象的第一层,是所有用户安全对象的继承之源,每一个Window 工作站对象可以拥有一些桌面对象,每一个桌面都拥有一个窗口链。窗口链里存放着显示在所属桌面的各种窗口。Window NT 用了两个桌面窗口对象,一个是用来处理登陆界面、屏蔽、锁住工作站等,一个是我们登陆之后进来操作的窗口了。
我们先要得到windows安装路径,例如C:/WINDOWS,当然有的可能D盘等等,需要一个函数 function GetWindows Path:String; var buf:Array[0..255] of Char; s: String; begin GetWindowsDirectory(@Buf,255); s:=StrPas(@Buf); if s[Length(s)] <> '\' then s:= s + '\'; Result:=s; end;
同时编写一个函数,进行虚拟桌面的创建,利用的是微软 的API:CreateDesktop function CreateANewDesktop(DesktopName: string): Boolean; var sin:TStartupInfo; pin:TProcessInformation; Desk:HDesk; begin result := false; Desk:= 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(GetWindowsPath+'explorer.exe'),nil,nil,nil,False,0,nil,nil,sin,pin); Sleep(2000); result := true; finally CloseDesktop(Desk); end; end;
我在程序界面添加了一个listbox控件,进行虚拟桌面的存放。 procedure TForm1.Button1Click(Sender: TObject); begin CreateANewDesktop('desktop'+inttostr(listbox1.Items.Count+1));//创建一个虚拟桌面,名字是desktop+编号 listbox1.Items.Add('desktop'+inttostr(listbox1.Items.Count+1)); end;
进行虚拟桌面的切换 procedure DesktopSwitch(DesktopName: String); var Desk: HDESK; begin Desk:=OpenDesktop(PChar(DesktopName),DF_ALLOWOTHERACCOUNTHOOK,False,MAXIMUM_ALLOWED ); Sleep(100); SwitchDesktop(Desk); CloseDesktop(Desk); end;
这个函数是进行切换虚拟桌面的 ,当我们选择listbox里的一个项目时,则切换过去,。。。 procedure TForm1.Button3Click(Sender: TObject); begin DesktopSwitch(listbox1.Items.Strings[listbox1.ItemIndex]);//应该都明白吧?切换到选择项目的名字 end;
procedure TForm1.Button2Click(Sender: TObject); begin DesktopSwitch('Default'); //default代表默认桌面。呵呵! end;
接下来是关闭了。。。 procedure TForm1.Button4Click(Sender: TObject); var Desk:HDESK; begin desk:=OpenDesktop(pchar(listbox1.Items.Strings[listbox1.ItemIndex]),0,false,MAXIMUM_ALLOWED); closedesktop(desk); end;