| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1358 人关注过本帖
标题:如何通过创建一个新桌面然后调用某个应用程序在新桌面上运行?
只看楼主 加入收藏
qiuxingce
Rank: 2
等 级:论坛游民
帖 子:118
专家分:93
注 册:2014-1-17
结帖率:73.33%
收藏
已结贴  问题点数:20 回复次数:6 
如何通过创建一个新桌面然后调用某个应用程序在新桌面上运行?
记得以前在哪个地方看过,想不起来。
这样做的目的是在调用那个应用程序后,操作者只能使用那个应用程序,不能干其它任何事情,就包括按CTRL ALT DEL也不会调出任务管理器,直到退出那个应用程序为止。
搜索更多相关主题的帖子: 应用程序 桌面 创建 调用 运行 
2020-04-07 16:34
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10609
专家分:43210
注 册:2014-5-20
收藏
得分:20 
什么程序要那么“霸道”
2020-04-07 17:39
qiuxingce
Rank: 2
等 级:论坛游民
帖 子:118
专家分:93
注 册:2014-1-17
收藏
得分:0 
回复 2楼 吹水佬
代码找到了,可惜是VFP9.0的,其中BINTOC和CTOBION函数的第二个参数使用了RS,VFP8.0不支持,可俺偏偏就用VFP8.0
m.oDesktop = NEWOBJECT( 'NewDesktop' )
IF ( 'O' == VARTYPE( m.oDesktop )) AND !ISNULL( m.oDesktop )
  m.cFile = GETFILE( 'exe', '文件名(&N):', '运行(&R)', 0, '请选择要在新桌面中运行的程序' )
  m.oDesktop.Run( m.cFile )
ENDIF
m.oDesktop = NULL
DEFINE CLASS NewDesktop AS Custom
  HIDDEN hOldDesktop
  hOldDesktop = 0
  HIDDEN hOldInput
  hOldInput = 0
  HIDDEN hNewDesktop
  hNewDesktop = 0
  HIDDEN pcNewDesktop
  pcNewDesktop = 0
  HIDDEN NewDesktopName
  NewDesktopName = ('desktop' +SYS(2015))
  HIDDEN ErrMsg
  ErrMsg = ''
  Name = 'NewDesktop'
  HIDDEN PROCEDURE api_decl
    DECLARE Long GetThreadDesktop IN WIN32API Long dwThreadId
    DECLARE Long OpenInputDesktop IN WIN32API ;
      Long dwFlags, Long fInherit, Long dwDesiredAccess
    DECLARE Long CreateDesktop IN WIN32API ;
      String lpszDesktop, Long lpszDevice, Long pDevmode, ;
      Long dwFlags, Long dwDesiredAccess, Long lpsa
    DECLARE Long SetThreadDesktop IN WIN32API Long hDesktop
    DECLARE Long SwitchDesktop IN WIN32API Long hDesktop
    DECLARE Long CloseDesktop IN WIN32API Long hDesktop
    DECLARE Long CreateProcess IN WIN32API ;
      String pszAppName, String pszCmdLine, ;
      Long lpProcessAttr, Long lpThreadAttr, ;
      Long bInheritHandles, Long dwCreationFlags, ;
      Long lpEnvironment, String pszCurDir, ;
      String lpStartupInfo, String @ lpProcInfo
    DECLARE Long CloseHandle IN WIN32API Long hObject
    DECLARE Long WaitForSingleObject IN WIN32API ;
      Long hHandle, Long dwMilliseconds
    DECLARE Long GetProcessHeap IN WIN32API
    DECLARE Long HeapAlloc IN WIN32API ;
      Long hHeap, Long dwFlags, Long dwBytes
    DECLARE Long HeapFree IN WIN32API ;
      Long hHeap, Long dwFlags, Long lpMem
    DECLARE Long GetLastError IN WIN32API

    This.pcNewDesktop = HeapAlloc( GetProcessHeap(), 8, LEN(This.NewDesktopName)+1 )
    IF ( 0 == This.pcNewDesktop )
      MESSAGEBOX( '内存分配失败 !', 16, '错误' )
    ELSE
      SYS( 2600, This.pcNewDesktop, LEN(This.NewDesktopName), This.NewDesktopName )
    ENDIF
  ENDPROC
  PROCEDURE Run
    *!*  ------------------------------------------------------------------------
    *!*  功能: 在新建桌面中运行指定的程序
    *!*  入口: tcExeFile - 要执行的 exe 文件
    *!*      tiTimeout - 等待执行时间(单位 ms, 0 代表一直等待到它终止并退出)
    *!*  ------------------------------------------------------------------------
    LPARAMETERS tcExeFile, tiTimeout
    IF ( 'C' != VARTYPE( m.tcExeFile )) OR EMPTY( m.tcExeFile )
      RETURN .F.
    ENDIF
    IF ( PCOUNT() < 2 ) OR ( 'N' != VARTYPE( m.tiTimeout )) OR ( m.tiTimeout <= 0 )
      m.tiTimeout = -1
    ENDIF

    This.ErrMsg = ''
    IF This.SwitchToNewDesktop()
      This.StartProcess( m.tcExeFile, m.tiTimeout )
    ENDIF

    IF !EMPTY( This.ErrMsg )
      MESSAGEBOX( This.ErrMsg, 16, '错误' )
    ENDIF
  ENDPROC

  HIDDEN PROCEDURE SwitchToNewDesktop
    #define DESKTOP_SWITCHDESKTOP       0x0100
    #define GENERIC_ALL                 0x10000000

    *!* 保存当前线程所在的桌面句柄
    This.hOldDesktop = GetThreadDesktop( _vfp.ThreadId )
    *!* 保存当前用户输入线程的桌面句柄
    This.hOldInput = OpenInputDesktop( 0, 0, DESKTOP_SWITCHDESKTOP )
    *!* 创建新桌面
    This.hNewDesktop = CreateDesktop( This.NewDesktopName, 0, 0, 0, GENERIC_ALL, 0 )

    IF ( 0 == This.hNewDesktop )
      This.ErrMsg = '创建桌面失败!错误代码: ' + TRANSFORM( GetLastError())
      RETURN .F.
    ENDIF

    *!* 切换当前线程到新建桌面中
    SetThreadDesktop( This.hNewDesktop )
    IF ( 0 == SwitchDesktop( This.hNewDesktop ))
      This.ErrMsg = '切换桌面失败!错误代码: ' + TRANSFORM( GetLastError())
      RETURN .F.
    ENDIF
  ENDPROC
  HIDDEN PROCEDURE StartProcess
    LPARAMETERS tcExeFile, tiTimeout
   
    *!*  typedef struct _PROCESS_INFORMATION {
    *!*    HANDLE hProcess;
    *!*    HANDLE hThread;
    *!*    DWORD dwProcessId;
    *!*    DWORD dwThreadId;
    *!*  } PROCESS_INFORMATION

    *!*  typedef struct _STARTUPINFO {
    *!*    DWORD cb;
    *!*    LPTSTR lpReserved;
    *!*    LPTSTR lpDesktop;
    *!*    LPTSTR lpTitle;
    *!*    DWORD dwX;
    *!*    DWORD dwY;
    *!*    DWORD dwXSize;
    *!*    DWORD dwYSize;
    *!*    DWORD dwXCountChars;
    *!*    DWORD dwYCountChars;
    *!*    DWORD dwFillAttribute;
    *!*    DWORD dwFlags;
    *!*    WORD wShowWindow;
    *!*    WORD cbReserved2;
    *!*    LPBYTE lpReserved2;
    *!*    HANDLE hStdInput;
    *!*    HANDLE hStdOutput;
    *!*    HANDLE hStdError;
    *!*  } STARTUPINFO
    LOCAL cSI, cPI, hProcess
    IF ( m.tiTimeout <= 0 )
      m.tiTimeout = -1
    ENDIF
    m.cSI = BINTOC( 0, 'rs' ) + BINTOC( This.pcNewDesktop, 'rs' ) + REPLICATE( CHR(0), 14*4 )
    m.cSI = BINTOC( LEN( m.cSI )+4, 'rs' ) + m.cSI
    m.cPI = REPLICATE( CHR(0), 4*4 )
    IF ( 0 == CreateProcess( ;
      m.tcExeFile, '', 0, 0, 0, 0, 0, NULL, m.cSI, @ m.cPI ))
      This.ErrMsg = '在新桌面中创建进程失败! 错误代码: ' + TRANSFORM( GetLastError())
    ELSE
      m.hProcess = CTOBIN( LEFT( m.cPI, 4 ), 'rs' )
      *!* 等待此进程终止
      WaitForSingleObject( m.hProcess, m.tiTimeout )
      *!* CloseHandle( m.hProcess )
    ENDIF
    This.ClearUp()
  ENDPROC
  HIDDEN PROCEDURE ClearUp
    IF ( 0 != This.hOldInput )
      SwitchDesktop( This.hOldInput )        && 切换回默认桌面
      This.hOldInput = 0
    ENDIF
    IF ( 0 != This.hOldDesktop )
      SetThreadDesktop( This.hOldDesktop )   && 回复原线程桌面
      This.hOldDesktop = 0
    ENDIF
    IF ( 0 != This.hNewDesktop )
      CloseDesktop( This.hNewDesktop )       && 关闭新建的桌面
      This.hNewDesktop = 0
    ENDIF
  ENDPROC
  PROCEDURE Init
    This.api_decl()
  ENDPROC
  PROCEDURE Destroy
    IF ( 0 != This.pcNewDesktop )
      HeapFree( GetProcessHeap(), 0, This.pcNewDesktop )
      This.pcNewDesktop = 0
    ENDIF
  ENDPROC
ENDDEFINE
2020-04-07 20:57
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10609
专家分:43210
注 册:2014-5-20
收藏
得分:0 
回复 3楼 qiuxingce
Win10试运行能调出任务管理器、切换用户等
有个问题,怎样使用输入法? 不能只看不做。
图片附件: 游客没有浏览图片的权限,请 登录注册
2020-04-07 22:25
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10609
专家分:43210
注 册:2014-5-20
收藏
得分:0 
以前用XP时试过在注册表可以设置只允许运行某些程序,其他都不能运行,连那些防病毒软件都挂了。
2020-04-07 22:32
qiuxingce
Rank: 2
等 级:论坛游民
帖 子:118
专家分:93
注 册:2014-1-17
收藏
得分:0 
回复 4楼 吹水佬
试验过,因为是VFP8.0,试验的时候出现新桌面,但调用的外部程序没有执行,经过研究发现就是BINTOC和CTOBIN的参数RS不受VFP8.0支持所致。因为正在做的应用不需要输入汉字,所以输入法不是问题,至于按CTRL ALT DEL出现任务管理器,这个可以通过另一段程序修改注册表解决。
2020-04-08 05:02
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10609
专家分:43210
注 册:2014-5-20
收藏
得分:0 
这个有点像屏保,做后台隐藏运行也可以。
2020-04-08 06:53
快速回复:如何通过创建一个新桌面然后调用某个应用程序在新桌面上运行?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018946 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved