文字性的描述留到后续文章再交代,还是先放一个小小的'大招',毕竟眼镜看见的东西,比起抽象的东西,更能引起初学者的注意,

如果你对这个感兴趣的话,这里有个链接,你可以去看看,

<<白话windows之 会话、工作站、桌面、窗口之间的关系>>
                 http://bbs.pediy.com/showthread.php?t=173271

1.用vs2013创建一个空项目,添加一个cpp文件,

#include<windows.h>
TCHAR szAppName[] = TEXT("TEST");        //窗口类名
#define DESTOP_NAME  TEXT("MY_DESTOP")    //定义我要创建的桌面名称ATOM m_HotKeyId1;          //用于注册ctrl+shift+F6  ,切换到原来的活动桌面
ATOM m_HotKeyId2;           //用于注册ctrl+shift+F7   ,将活动桌面切换到我们新创建的桌面,
ATOM m_HotKeyId3;           //用于正确退出程序,因为程序没有相应界面且需要释放一些资源
HDESK hDDesk;HWINSTA  hWinStaThisProcess = GetProcessWindowStation( );         //程序运行起来,获取系统为该进程设置的默认交互工作站
HDESK hDeskOriignInput = OpenInputDesktop(0,FALSE,GENERIC_ALL);        //程序运行起来,获取系统为该线程设置的默认活动桌面
void OnHotKey(WPARAM wParam,LPARAM lParam)
{static LRESULT lRes = 0;if(wParam == m_HotKeyId1)//热键1被按下{// 该热键按下时的处理SwitchDesktop(hDeskOriignInput);  //原活动桌面被显现出来//MessageBox(0,TEXT("F6"),0,0);}else if(wParam == m_HotKeyId2)//热键2被按下{SwitchDesktop(hDDesk);               //我们创建的桌面显现出来//MessageBox(0,TEXT("F7"),0,0);}else if(wParam == m_HotKeyId3)//热键2被按下{MessageBox(0,TEXT("程序退出"),0,0);PostQuitMessage(0);            //我们创建的桌面显现出来//MessageBox(0,TEXT("F7"),0,0);}return ;
}
LRESULT     CALLBACK    WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{switch(message){case WM_HOTKEY:OnHotKey(wParam,lParam);return 0;}return DefWindowProc(hwnd,message,wParam,lParam);
}int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)
{HWND hwnd;MSG   msg;WNDCLASS   wndclass;wndclass.style = CS_HREDRAW | CS_VREDRAW;wndclass.lpfnWndProc = WndProc;wndclass.cbClsExtra = 0;wndclass.cbWndExtra = 0;wndclass.hInstance = hInstance;wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION);wndclass.hCursor = LoadCursor(NULL,IDC_ARROW);wndclass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);wndclass.lpszMenuName = NULL;wndclass.lpszClassName = szAppName;if(!RegisterClass(&wndclass)){MessageBox(NULL,TEXT("窗口注册失败!"),NULL,0);return 0;}hwnd = CreateWindow(szAppName,szAppName,WS_OVERLAPPEDWINDOW,0,0,0,0,NULL,NULL,hInstance,NULL);<span style="white-space:pre">    </span>//在进程 默认的交互式工作站中创建 桌面,hDDesk = CreateDesktop(DESTOP_NAME,0,0,0,GENERIC_ALL,NULL);//设置与本线程相联系的桌面为 我们创建的桌面SetThreadDesktop(hDDesk);//填写STARTUPINFO 结构体信息,注意与平常创建进程的不同,这里有了lpDesktop选项的设置,STARTUPINFO sti = {sizeof(sti)};sti.lpDesktop = DESTOP_NAME;PROCESS_INFORMATION pi = {0};CreateProcess(TEXT("C:\\Windows\\explorer.exe"),NULL,NULL,NULL,TRUE,0,NULL,NULL,&sti,&pi);/****************************************************************注册3个热键******************************************************************///在全局原子表中添加一项字符串得到id一个,这一项跟   CTRL +SHIFT+F6 有关m_HotKeyId1 = GlobalAddAtomW(TEXT("HotKey1")) - 0xc000;//注册得到的id与 热键CTRL+SHIFT+F6 关联起来RegisterHotKey(hwnd,m_HotKeyId1,MOD_CONTROL | MOD_SHIFT,VK_F6);//在全局原子表中添加一项字符串得到id一个,这一项跟   CTRL +SHIFT+F7 有关m_HotKeyId2 = GlobalAddAtomW(TEXT("HotKey2")) - 0xc000;//注册得到的id与 热键CTRL+SHIFT+F7 关联起来RegisterHotKey(hwnd,m_HotKeyId2,MOD_CONTROL | MOD_SHIFT,VK_F7);//在全局原子表中添加一项字符串得到id一个,这一项跟   F7 有关m_HotKeyId3 = GlobalAddAtomW(TEXT("HotKey3")) - 0xc000;//注册得到的id与 热键F7 关联起来RegisterHotKey(hwnd,m_HotKeyId3,0,VK_F7);/*********************************************************************************************************************///窗口消息循环while(GetMessage(&msg,NULL,0,0)){TranslateMessage(&msg);DispatchMessage(&msg);}//F7 热键按下,即退出,顺便清理资源UnregisterHotKey(hwnd,m_HotKeyId1);GlobalDeleteAtom(m_HotKeyId1);UnregisterHotKey(hwnd,m_HotKeyId2);GlobalDeleteAtom(m_HotKeyId2);UnregisterHotKey(hwnd,m_HotKeyId3);GlobalDeleteAtom(m_HotKeyId3);CloseHandle(hDDesk);return msg.wParam;
}


2.可能会遇见的问题,

2.1SwitchDesktop失败,GetLastError ()  返回  error_access_dinied   这个错误通常跟管理员权限没提权有关,但是这里不是这样的,

而是, 1.你创建的桌面不在交互工作站中, 

在这之前你得知道 你的程序, 系统默认给其对应的进程 关联到   一个   交互式工作站,

2.怎样将创建的桌面跟工作站产生   包含的逻辑关系   呢? 

通过  给进程SetProcessWinstation()关联工作站  ,(这里省略了这一步,因为我已经知道,进程和工作站的关联关系了)

给线程SetThreadDesktop() 关联桌面,这样一来,二者的关系是不是可以想象出有了联系了呢?

这里的两个函数忽略了参数,要是你有兴趣的话可以看看下面msdn链接的解释

Window Station and Desktop Functions

该页面给出的是一族windows api,这些api都比较好理解

2.2,           64位系统下,用vs2013 64位编译的方式编译,32位系统下,程序用32位编译方式

2.3

STARTUPINFO sti = {
sizeof(sti)
};
sti.lpDesktop = DESTOP_NAME;

若是第一次启动了这个程序的话,将会生成一个explorer.exe进程,此时若是在任务管理器中查看,有2个explorer进程,若是关闭我们的程序,这个2explorer进程个不会受到
影响,当第二次执行我们的程序时,(未关机),会发现窗口2中的东西和之前一样,没有变化

创建一个简易的虚拟桌面相关推荐

  1. Windows10系统快捷键创建一个新的虚拟桌面

    Win键+Ctrl+D:创建一个新的虚拟桌面 Win键+Ctrl+F4:关闭虚拟桌面 Win键+Ctrl+左/右:切换虚拟桌面

  2. 依赖注入[5]: 创建一个简易版的DI框架[下篇]

    为了让读者朋友们能够对.NET Core DI框架的实现原理具有一个深刻而认识,我们采用与之类似的设计构架了一个名为Cat的DI框架.在<依赖注入[4]: 创建一个简易版的DI框架[上篇]> ...

  3. 如何使用 Java AWT 创建一个简易计算器

    本文分享自华为云社区<手把手教你使用 Java AWT 创建一个简易计算器>,作者:海拥 . 关于AWT AWT (抽象窗口工具包)是一个有助于构建 GUI 的 API (图形用户界面)基 ...

  4. 基于 Spring Boot 2.x 使用 Activiti 创建一个简易的请假流程

    文章目录 1 摘要 2 准备工作 3 请假流程图 3 核心代码 3.1 数据库表 3.2 流程管理工具类 3.3 流程的使用 4 推荐参考资料 5 Github 源码 ​ ​ ​ 1 摘要 工作流是需 ...

  5. python建立一个简单的server_使用Python创建一个简易的Web Server

    Python 2.x中自带了SimpleHTTPServer模块,到Python3.x中,该模块被合并到了http.server模块中.使用该模块,可以快速创建一个简易的Web服务器. 我们在C:\U ...

  6. 使用java创建一个简易的视屏播放器

    最近有个多媒体的作业,要求使用visualC++和opencv编写一个简易的视屏播放器,对于C/C++残疾者而言是不可能的,于是萌生了用java编写的想法.具体经验分享一下. 目标:制作简易视屏播放器 ...

  7. java 生成media_使用java创建一个简易的视屏播放器

    最近有个多媒体的作业,要求使用visualC++和opencv编写一个简易的视屏播放器,对于C/C++残疾者而言是不可能的,于是萌生了用java编写的想法.具体经验分享一下. 目标:制作简易视屏播放器 ...

  8. 【Python】快速创建一个简易 HTTP 服务器(http.server)

    引言 http.server 是 socketserver.TCPServer 的子类,它在 HTTP 套接字上创建和监听,并将请求分派给处理程序.本文是关于如何使用 Python 的 http.se ...

  9. three 天空球_用three.js创建一个简易的天空盒

    本文创建的天空盒是用六张图片来创建的.笔者会论述两种方法来创建,都是最简单基本的方法,不涉及着色器的使用. 一种是创建一个盒子,然后将图片作为盒子6个面的纹理贴上来创建. 另一种则是简单的将纹理作为场 ...

最新文章

  1. oracle websp,探索Web2.0成就SP 2.0之路
  2. 如何在MySQL中为多个列指定唯一约束?
  3. 深度优先搜索和广度优先搜索的比较与分析
  4. getparameter的使用
  5. 国际软件设计文档——概要设计说明书
  6. (线性基) bzoj 2460
  7. 【人体姿态估计1】Convolutional Pose Machines_2016
  8. 牛客网--牛牛找工作
  9. 英语四级单选测试软件,英语四级报告单选纸质还是电子?选择电子版报告单可能更好...
  10. 一个3D城市地图应用开发工具,等你获取 ThingJS 3D 全景 可视化
  11. 黑客突破防火墙常用的几种技术(转)
  12. windows 安装labelme
  13. lopa分析_保护层分析(LOPA)
  14. Tecnomatix plant simulation 进阶--生产系统仿真:Plant Simulation应用教程
  15. IEC61850开发流程
  16. 22、python数据处理虚拟变量的转化
  17. rpc服务器没响应,windows 2008 RPC 服务器不可用
  18. 没有下载券和财富值如何下载文库的资料
  19. Camtasia Studio mac下载V2020汉化补丁中文版视频录制及剪辑工具软件
  20. yolov5-6 The “freeze_support()“ line can be omitted if the program is not going to be frozen

热门文章

  1. python matplotlib 条形图的填充效果
  2. 云客Drupal源码分析之实体Entity概述
  3. TimedCache 带时间缓存工具类,附加监听回调 | Java工具类
  4. 图片怎么批量压缩?进来学习一下压缩图片的好方法
  5. mysql优化器放弃索引场景,MYSQL索引优化(索引失效场景)
  6. 互联网公司背后的安防逻辑
  7. ai培训师讲师叶梓:计算机视觉领域的自监督学习模型——MAE-5
  8. 从Windows 10上下文菜单中删除SkyDrive Pro选项
  9. 【latex】论文或参考文献中出现俄文\西班牙文人名的解决方法
  10. GreenBrowser令我比较喜欢的功能