关于虚拟桌面的问题 ( 积分: 100 )

  • 主题发起人 主题发起人 hs-kill
  • 开始时间 开始时间
H

hs-kill

Unregistered / Unconfirmed
GUEST, unregistred user!
用CreateDesktop来创建个桌面以后,可以在他的上面运行新程序,这都好办<br>但是我想把我本身创建虚拟桌面的程序也转到这个新的虚拟桌面上.......这么办<br>也就是说我的程序:<br>1.启动后创建一个虚拟桌面<br>2.把自己转移到虚拟桌面上<br>3.做事<br>4.把自己转回原来的桌面<br>5.关闭虚拟桌面<br><br>现在创建关闭都好办,但是转移桌面这问题一直没搞定<br>我用下面代码:<br>program&nbsp;Project1;<br><br>uses<br>&nbsp;&nbsp;Windows,Forms;<br><br>{$R&nbsp;*.res}<br><br>var<br>&nbsp;&nbsp;hSta:HDESK;<br>&nbsp;&nbsp;olddh,desktophandle:HDESK;<br>const<br>&nbsp;&nbsp;newdtname='111111';<br>begin<br>&nbsp;&nbsp;Application.Initialize;<br>&nbsp;&nbsp;desktophandle:=CreateDesktop(pchar(newdtname),<br>&nbsp;&nbsp;&nbsp;&nbsp;Nil,&nbsp;Nil,&nbsp;0,<br>&nbsp;&nbsp;&nbsp;&nbsp;DESKTOP_CREATEMENU&nbsp;or<br>&nbsp;&nbsp;&nbsp;&nbsp;DESKTOP_CREATEWINDOW&nbsp;or<br>&nbsp;&nbsp;&nbsp;&nbsp;DESKTOP_SWITCHDESKTOP&nbsp;or<br>&nbsp;&nbsp;&nbsp;&nbsp;DESKTOP_READOBJECTS&nbsp;or<br>&nbsp;&nbsp;&nbsp;&nbsp;DESKTOP_WRITEOBJECTS&nbsp;or<br>&nbsp;&nbsp;&nbsp;&nbsp;STANDARD_RIGHTS_REQUIRED,<br>&nbsp;&nbsp;&nbsp;&nbsp;Nil&nbsp;);<br>&nbsp;&nbsp;if&nbsp;not&nbsp;SetProcessWindowStation(desktophandle)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;messagebox(0,'SetProcessWindowStation&nbsp;error','',mb_ok);<br>&nbsp;&nbsp;if&nbsp;not&nbsp;SetThreadDesktop(desktophandle)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;messagebox(0,'SetThreadDesktop&nbsp;error','',mb_ok)<br>&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;SwitchDesktop(desktophandle);<br>&nbsp;&nbsp;Application.Run;<br>end.<br><br>在使用SetProcessWindowStation和SetThreadDesktop的时候过不去<br>按照MSDN上说明SetThreadDesktop的进程不能有任何UI和hook之类的东西<br>我把这些放到了project里,按说应该不存在任何UI和hook的东西了,为什么还是失败<br>难道必须重新create一个进程?还是我的理解错了?<br><br>请各位高手指点下.........<br><br>至于其他方法.....我想了一个,把要运行的程序当作资源加进另一个exe里,执行后先释放这个资源,然后创建桌面,在那个桌面执行这个exe.........<br>不过万不得以我是实在不想这么做.......
 
换一种思路:<br>1&nbsp;.临时程序A建立桌面!<br>2.&nbsp;CreateProcesser&nbsp;有个参数就是桌面!那么A建立进程B于心桌面即可!<br>B就是你要作事情的程序!
 
是啊&nbsp;&nbsp;wql说的就是我最下面提到的其他方法......这个我最一开始就实现了.....<br>这么做的麻烦就在于我必须建立一个创建桌面的临时程序,而我做事的程序又不能让客户直接执行(所以我要建立临时桌面)<br>这样导致我如果采用这种方法就要先建立exe,再建立个释放的程序,麻烦了点<br>我主要想把建立桌面并移植的部分写成一个单独的unit可以让多个程序编写的时候直接引用就可以了<br>所以说万不得已我不想这么做.......<br><br>最关键的是,我想知道到底是不是可以自己建立临时桌面,再把自己移植到临时桌面上,这个方法是否可行
 
不可以自己建立临时桌面,再把自己移植到临时桌面上!<br>因为:<br>1.&nbsp;建立桌面的京城属于Default桌面!<br>2.&nbsp;而其他桌面只能是没有消息的京城或县城能够返问的!&nbsp;但是不能移植!<br>3.&nbsp;其实我的方法可以通过UDP消息同志的方式实现啊!<br>&nbsp;&nbsp;&nbsp;A进程&nbsp;UDP&nbsp;&nbsp;&nbsp;----&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Default桌面的实际京城<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&gt;&nbsp;&nbsp;通讯!<br>&nbsp;&nbsp;&nbsp;B进程&nbsp;UDP&nbsp;&nbsp;&nbsp;----&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;虚拟桌面的实际京城
 
......你是说,开2个一样的进程?&nbsp;我没看明白......要UDP干吗?<br><br>其实我现在实现的是.:<br>建立一个无窗体程序A,这个程序编译的时候会引用一个资源文件(exe)<br>运行后,首先创建一个虚拟桌面<br>然后释放这个资源文件到临时文件夹,用CreateProcesser在虚拟桌面运行这个资源文件,同时用waitfor来等待这个进程的结束<br>进程结束后,释放这个虚拟桌面,结束自己的进程<br><br>这样就是麻烦到,每次升级过资源文件,都要重新编译进程A......<br>懒的搞这步-_-!
 
......你是说,开2个一样的进程?&nbsp;我没看明白......要UDP干吗?<br><br>其实我现在实现的是.:<br>建立一个无窗体程序A,这个程序编译的时候会引用一个资源文件(exe)<br>运行后,首先创建一个虚拟桌面<br>然后释放这个资源文件到临时文件夹,用CreateProcesser在虚拟桌面运行这个资源文件,同时用waitfor来等待这个进程的结束<br>进程结束后,释放这个虚拟桌面,结束自己的进程<br><br>这样就是麻烦到,每次升级过资源文件,都要重新编译进程A......<br>懒的搞这步-_-!
 
这个我做过.<br>去查SetThreadDesktop这个API
 
UDP通讯就可以互相转告单前状态啊!
 
后退
顶部