能力值:
( LV9,RANK:490 )
2 楼
也来研究一下,慢慢学习
能力值:
( LV12,RANK:1010 )
3 楼
谢谢分享 .
能力值:
( LV2,RANK:10 )
4 楼
这个东西我支持,希望做更多的尝试。
能力值:
( LV2,RANK:10 )
5 楼
这个很有用啊,游戏多开,不知可以不
能力值:
( LV2,RANK:10 )
6 楼
晕死 &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
我按照你的方法 创建了一个桌面 并进入了该桌面
可是该桌面除了 计算器之外
啥也没有 ,想返回原桌面 却又无法返回
只好重新启动系统
原来写的代码都丢失了 5555555555555
能力值:
( LV2,RANK:10 )
7 楼
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
hvirtualdesk:thandle;
si:STARTUPINFO;
pi:PROCESS_INFORMATION ;
caclpid:dword;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
hvirtualDesk:=CreateDesktop('newdesk',
NiL,
Nil,
DF_ALLOWOTHERACCOUNTHOOK,
GENERIC_ALL,
NiL);
ZeroMemory(@si, sizeof(si));
si.cb := sizeof(si);
si.lpDesktop := pchar('newdesk');
ZeroMemory(@pi, sizeof(pi));
if CreateProcess(NiL,
'calc.exe',
NiL,
NiL,
FALSE,
0,
NiL,
NiL,
si,
pi ) then begin
caclpid :=pi.dwThreadId;
end else begin
MessageBox(0,'运行计算器失败','Error',0);
ExitProcess(1);
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
SwitchDesktop(GetThreadDesktop(caclpid));
end;
end.
按一下计算机主机开关 就回到了 原始桌面 原理不清楚
能力值:
( LV2,RANK:10 )
8 楼
7楼的代码有时好使 有时 又不管用
why?
能力值:
( LV13,RANK:283 )
9 楼
handle leak
能力值:
( LV9,RANK:290 )
10 楼
想在新创建的桌面上看到“我的电脑”和开始菜单,任务栏等必须要创建"explorer"进程
能力值:
( LV2,RANK:10 )
11 楼
谢谢共享,研究研究一下
能力值:
( LV3,RANK:20 )
12 楼
把所有explorer结束掉 再创建一个就返回原来桌面了
不过楼主应该设置一快接见
能力值:
( LV3,RANK:20 )
13 楼
多谢分享....
能力值:
( LV2,RANK:10 )
14 楼
呵呵,有意思,真快!
能力值:
( LV2,RANK:10 )
15 楼
sysinternals.com有个工具和楼主的应该一样叫Desktops http://technet.microsoft.com/en-us/sysinternals/cc817881.aspx
能力值:
( LV2,RANK:10 )
16 楼
var
Form1: TForm1;
hvirtualdesk:thandle;
si:STARTUPINFO;
pi:PROCESS_INFORMATION ;
caclpid:dword;
hproc:boolean;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
hvirtualDesk:=CreateDesktop('newdesk',
NiL,
Nil,
DF_ALLOWOTHERACCOUNTHOOK,
GENERIC_ALL,
NiL);
if hvirtualdesk=0 then begin
messagebox(0,'创建桌面失败','error',0);
exit;
end;
ZeroMemory(@si, sizeof(si));
si.cb := sizeof(si);
si.lpDesktop := pchar('newdesk');
ZeroMemory(@pi, sizeof(pi));
hproc:=CreateProcess(NiL,'explorer.exe',NiL,NiL,FALSE,0,
NiL,NiL,si,pi);
if hproc=true then begin
caclpid :=pi.dwThreadId; // 这里取 DWTHREADID 怎么会是无效的参数呢 ?
end else begin
MessageBox(0,'打开进程失败','Error',0);
ExitProcess(1);
end;
end; procedure TForm1.Button2Click(Sender: TObject);
var
hd:dword;
begin
hd:=GetThreadDesktop(caclpid);
showmessage(inttostr(getlasterror()));
//这里会返回87 号错误 经查 是 无效的参数 错误
SwitchDesktop(hd);
end;
能力值:
( LV8,RANK:120 )
17 楼
看到Delphi我就昏...
能力值:
( LV2,RANK:10 )
18 楼
学习了 谢谢
能力值:
( LV2,RANK:10 )
19 楼
下载Desktops和LZ的东西研究一下
能力值:
( LV2,RANK:10 )
20 楼
为什么在新建的桌面下创建explorer.exe无效呢?
创建其它进程是可有建的。
是不是winXP sp2的explorer.exe有问题,即不能同时运行两个实例?
能力值:
( LV2,RANK:10 )
21 楼
虚拟桌面可以用来隐藏一些信息啊,不错
能力值:
( LV9,RANK:290 )
22 楼
创建explorer新线程时STARTUPINFO 的lpDesktop 必须是新桌面的名字
能力值:
( LV2,RANK:10 )
23 楼
谢谢了。
现在又出现一个问题,当我不再使用虚拟桌面时,如何删除新建的虚拟桌面?虽然说用closedesktop函数,但是这个函数的作用只是类似closehandle而已,虚拟的桌面并没有被删除,用了closedesktop任务管理器中还是有两个explorer.exe。也就是说新建的虚拟桌面还是存在,就算是把新桌面下的explorer.exe结束掉,虚拟桌面仍然存在,用opendesktop还能打开。要怎样彻底删除新建的桌面,删除后让opendesktop都不能再打开?
能力值:
( LV2,RANK:10 )
24 楼
还有一个问题就是在新建的桌面下按ctrl+alt+delete这三个键调不出任务管理器了,在新桌面上建winlogon.exe进程也不行。
能力值:
( LV2,RANK:10 )
25 楼
[QUOTE=;]...[/QUOTE]
好东西,支持!一直想学习虚拟桌面!今天才看到源码!