PROCESS_INFORMATION ProcessInfo;
STARTUPINFO StartupInfo;
HDESK hDesktop;
HDESK hOriginalThread;
HDESK hOriginalInput; //核心代码: //创建名称为“Virtual”的虚拟桌面
hDesktop = CreateDesktop("Virtual", NULL, NULL, , GENERIC_ALL , NULL); //初始化创建进程必须的结构体
ZeroMemory(&StartupInfo, sizeof(StartupInfo));
ZeroMemory(&ProcessInfo, sizeof(ProcessInfo));
StartupInfo.cb = sizeof(StartupInfo);
StartupInfo.lpDesktop = "Virtual"; //记录原始桌面的句柄
hOriginalThread = GetThreadDesktop(GetCurrentThreadId());
hOriginalInput = OpenInputDesktop(, FALSE, DESKTOP_SWITCHDESKTOP); //创建桌面外壳进程
CreateProcess(NULL, "explorer", NULL, NULL, FALSE, , NULL, NULL, &StartupInfo, &ProcessInfo); //下面是桌面切换代码: SetThreadDesktop(hDesktop); //设置桌面活动焦点是虚拟桌面
SwitchDesktop(hDesktop); //切换到虚拟桌面 SetThreadDesktop(hOriginalThread);
SwitchDesktop(hOriginalInput);
CloseDesktop(hDesktop); //关闭虚拟桌面 //核心代码就是这些,然后加入热键,设置程序切换时的特效什么的就自由添加好了 附上程序源代码: //stdafx.h //由于用到渐显渐隐的效果,需要加入AnimateWindow,由于VC6的限制,要在最上面加入 #undef WINVER
#define WINVER 0X500 //VitualDesktopDlg.h public:
  PROCESS_INFORMATION ProcessInfo;
  STARTUPINFO StartupInfo;
  HDESK hDesktop;
  HDESK hOriginalThread;
  HDESK hOriginalInput;
  BOOL IsOriginalDesktopActive; //是否在原始桌面rz
  BOOL IsInitialDesktop; //是否初始化桌面,防止灰色按钮克星造成不可估计的后果
  BOOL IsWindowShow; //程序是否可见 protected:   afx_msg LRESULT OnHotKey(WPARAM wParam, LPARAM lParam);//自定义热键消息 //VitualDesktopDlg.cpp #include <WINUSER.H>
#pragma comment(lib, "user32.lib")  //这两个是AnimateWindow要的头和库 BEGIN_MESSAGE_MAP(CVitualDesktopDlg, CDialog)
//{{AFX_MSG_MAP(CVitualDesktopDlg)
  ON_MESSAGE(WM_HOTKEY, OnHotKey) //链接热键消息
//}}AFX_MSG_MAP
END_MESSAGE_MAP() BOOL CVitualDesktopDlg::OnInitDialog()
{
  CDialog::OnInitDialog();
  ModifyStyleEx(WS_EX_APPWINDOW, WS_EX_TOOLWINDOW); //设置窗体样式为工具样式,这样任务栏就没有图标了   SetIcon(m_hIcon, TRUE); // Set big icon
  SetIcon(m_hIcon, FALSE); // Set small icon   IsOriginalDesktopActive = FALSE;
  IsInitialDesktop = TRUE;
  IsWindowShow = TRUE;
  RegisterHotKey(m_hWnd, , MOD_WIN, 'X'); //设置显示程序热键为 Win+X   return TRUE; // return TRUE unless you set the focus to a control
} void CVitualDesktopDlg::OnOK()
{
  if (IsInitialDesktop) //第一次运行时初始化程序,加上判断防止灰色按钮克星
  {
    //创建名称为“Virtual”的虚拟桌面
    hDesktop = CreateDesktop("Virtual", NULL, NULL, , GENERIC_ALL , NULL);     //初始化创建进程必须的结构体
    ZeroMemory(&StartupInfo, sizeof(StartupInfo));
    ZeroMemory(&ProcessInfo, sizeof(ProcessInfo));
    StartupInfo.cb = sizeof(StartupInfo);
    StartupInfo.lpDesktop = "Virtual";     //记录原始桌面的句柄
    hOriginalThread = GetThreadDesktop(GetCurrentThreadId());
    hOriginalInput = OpenInputDesktop(, FALSE, DESKTOP_SWITCHDESKTOP);     //创建桌面外壳进程
    CreateProcess(NULL, "explorer", NULL, NULL, FALSE, , NULL, NULL, &StartupInfo, &ProcessInfo);     //完成初始化,以后不会再次被调用,防止打开虚拟桌面出现资源管理器
    IsInitialDesktop = !IsInitialDesktop;     SetThreadDesktop(hDesktop); //设置桌面活动焦点是虚拟桌面
    SwitchDesktop(hDesktop); //切换到虚拟桌面     GetDlgItem(IDOK)->EnableWindow(FALSE); //设置初始化按钮失效,只允许热键操作
    RegisterHotKey(m_hWnd, , MOD_ALT, 'Z'); //设置热键为 Alt+Z
  }   return;
  CDialog::OnOK();
} void CVitualDesktopDlg::OnClose()
{
  //注销热键
  UnregisterHotKey(m_hWnd, );
  UnregisterHotKey(m_hWnd, );   //关闭创建的explorer
  if (!IsInitialDesktop)
  {
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessInfo.dwProcessId); //获取虚拟桌面的explorer句柄
    if(hProcess)
    {
    TerminateProcess(hProcess, ); //结束虚拟桌面的explorer
    }
    CloseHandle(hProcess);
  }
  exit();
  CDialog::OnClose();
} LRESULT CVitualDesktopDlg::OnHotKey(WPARAM wParam, LPARAM lParam)
{
  if (wParam == ) //消息为 Alt+Z 时
  {
    if (IsOriginalDesktopActive) //是否在原始桌面
    {
      hDesktop = CreateDesktop("Virtual", NULL, NULL, , GENERIC_ALL , NULL); //创建虚拟桌面(与CloseDesktop相对应)
      SetThreadDesktop(hDesktop);
      SwitchDesktop(hDesktop);
    }
    else
    {
      SetThreadDesktop(hOriginalThread);
      SwitchDesktop(hOriginalInput);
      CloseDesktop(hDesktop); //关闭虚拟桌面
    }
    IsOriginalDesktopActive = !IsOriginalDesktopActive;
  }
  if (wParam == )
  {
    if (IsWindowShow)
    {
      AnimateWindow(m_hWnd, , AW_BLEND|AW_HIDE);  //隐藏窗口
    }
    else
    {
      AnimateWindow(m_hWnd, , AW_BLEND);    //显示窗口
    }
    IsWindowShow = !IsWindowShow;
  }   return TRUE;
}

Windows虚拟桌面的更多相关文章

  1. Windows 虚拟桌面工具 Desktops v2.0

    https://technet.microsoft.com/en-us/sysinternals/cc817881.aspx

  2. NVIDIA GRID 和 NICE DCV 技术用于实现 Linux 和 Windows® 图形加速虚拟桌面

    NVIDIA GRID 和 NICE DCV 技术用于实现 Linux 和 Windows® 图形加速虚拟桌面. NICE DCV: 满足 LINUX 和 WINDOWS 的远程 3D 通过 NICE ...

  3. vmware 桌面虚拟化 horizon view 介绍(使用微软的RDP协议或vmware 专有的PCoIP协议,连接到虚拟桌面,并且可以使用本地的USB设备、本地存储)

    虚拟化(一):虚拟化及vmware产品介绍 虚拟化(二):虚拟化及vmware workstation产品使用 虚拟化(三):vsphere套件的安装注意及使用 虚拟化(四):vsphere高可用功能 ...

  4. Windows 10 虚拟桌面切换

    从Windows 10开始,终于有了和Mac一样的虚拟桌面了.但总感觉用着非常的别扭.在Mac中,切换虚拟桌面的操作可谓方便至极:除了触控板和Magic Mouse原生的支持外,通过罗技M557/55 ...

  5. 开发者神器!Windows上最强大的虚拟桌面工具-Dexpot

    简介 : 用过Linux和Mac计算机的人都知道 , 这两个系统上都有个多桌面的功能非常使用 . 而在Windows上并没有该项功能 , 虽然目前Win10已经增加了多桌面的程序 , 但使用上仍体验不 ...

  6. virgo虚拟桌面

    转载: http://www.appinn.com/virgo-virtual-desktop-for-windows/ virgo 是一款 Windows 下的极简虚拟桌面,源程序自身只有 7KB, ...

  7. [IT新应用]如何部署CITRIX 虚拟桌面

    1.搭建AD,并部署dhcp. 2.安装ddc服务器,加入域.这台服务器就是用来发布后端服务器或者WIN7的PC给用户使用.相当于调度. 3.安装windows server或者win7,用于发布给用 ...

  8. 虚拟桌面基础架构(VDI)与终端服务和传统PC对比

    VDI(Virtual Desktop Infrastructure),即虚拟桌面基础架构,正迅速成为一个热门词汇,它将颠覆企业向终端用户交付应用的游戏规则.这篇专题就是想通过VDI与两种传统技术的对 ...

  9. 从零开始部署小型企业级虚拟桌面 -- Vmware Horizon View 6 For Linux VDI -- 结构规划

    环境说明 注,本套环境所用机器全部是64位的. 管理服务器载体:安装win7操作系统,通过VMware Workstation安装4台虚拟机,用作vCenter,Connection Server,D ...

随机推荐

  1. css3 实现png图片改变背景颜色

    实际上是用的是就是css的filter的drop-shadow属性 drop-shadow: 1 不支持内阴影 2 不支持多阴影 3 兼容性 ie13+  谷歌 火狐   android4.4+  i ...

  2. CSS counter计数器(content目录序号自动递增)详解

    一.CSS计数器三角关系 CSS计数器只能跟content属性在一起的时候才有作用,而content属性貌似专门用在before/after伪元素上的.于是,就有了,“计数器↔伪元素↔content属 ...

  3. 收藏产品判断、html 在 UIwebView里面显示

     收藏产品功能 要求:用户点击收藏,如果已经收藏,用户点击就取消收藏 写法一: 点击事件{ if (!isSelect) { [sender setImage:[UIImage imageNamed: ...

  4. perceptron and ANN

    %% Perceptron Regression close all clear %%load data x = load('ex4x.dat'); y = load('ex4y.dat'); x=o ...

  5. Java 8中Collection转为Map的方法

    Java 8中java.util.stream.Collectors提供了几个方法可用于把Collection转为Map结构,本文记录了个人对其中三个的理解. Method Return Type g ...

  6. 51nod 1347 【水】

    #include<cstdio> #include <map> #include<iostream> #include<string.h> #inclu ...

  7. 二分匹配ZOJ3646

    //题意:类比线代里:把矩阵中的U看作[1],是否满足一个满秩矩阵 //利用二分匹配就是 //每一行都有相对应的列: #include<iostream> #include<stri ...

  8. python __builtins__ zip类 (71)

    71.'zip' , 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表.如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作 ...

  9. bzoj 1385: [Baltic2000]Division expression【脑洞】

    加括号再去括号就是除变加,显然尽可能多的除变加是最优的,然后发现唯一不能变成乘数的是第二个数,所以把其他数乘起来mod第二个数,如果是0就是YES,否则说明最后不能除尽,就是NO #include&l ...

  10. 揭开Python科学计算的面纱

    春牛春杖.无限春风来海上.便与春工.染得桃红似肉红. 春幡春胜.一阵春风吹酒醒.不似天涯.卷起杨花似雪花. 标准的Python中用列表保存一组值,可以当做数组使用,但是由于其值类型任意,所以列表中保存 ...