C++ 打开一个虚拟桌面的代码

看不明白的地方 请查看demo: http://download.csdn.net/detail/allh45601/7224205

QQ群:103197177 C++进阶讨论;欢迎喜欢编程朋友加入进来一起讨论学习;

// Run.cpp : 定义应用程序的入口点。
// #include "stdafx.h"
#include "Run.h"
#include <atlstr.h> #include "shellapi.h"
#pragma comment("lib", "shell32.lib"); #define dim(x) (sizeof(x) / sizeof(x[0])) // 全局变量:
HINSTANCE g_hInst = NULL; // 当前实例
TCHAR g_szTitle[] = TEXT("Running"); // 窗口名称
TCHAR g_szWindowClass[] = TEXT("Run-2012"); // 主窗口类名
HWND g_hWnd = NULL;
CString g_strDirPath; // 注册dll批处理路径 HDESK g_hPreDesk = NULL; // 原始桌面
HDESK g_hVirtualDesk = NULL; // 虚拟桌面
HANDLE g_hEvent = NULL; LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
LRESULT OnShowWindow (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
LRESULT OnCreate (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
LRESULT OnDestroy (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
LRESULT GoVirualDesk (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
LRESULT GoPreviousDesk (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); struct MSGMAP_ENTRY
{
UINT nMessage;
LRESULT (*pfn) (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
}; struct MSGMAP_ENTRY _messageEntries[] =
{
WM_DESTROY, OnDestroy,
WM_SHOWWINDOW, OnShowWindow,
WM_CREATE, OnCreate,
GO_VIRTUAL_DESK, GoVirualDesk,
GO_PREVIOUS_DESK, GoPreviousDesk,
}; // 此代码模块中包含的函数的前向声明:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
void Run (void);
void GoPreDeskThread (void); int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
MyRegisterClass(hInstance); if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
} MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
} return msg.wParam;
} LRESULT CALLBACK WindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
for (int i=0; i<dim(_messageEntries); i++)
{
if (uMsg == _messageEntries[i].nMessage)
{
return (*_messageEntries[i].pfn)(hwnd, uMsg, wParam, lParam);
}
} return DefWindowProc(hwnd, uMsg, wParam, lParam);
} LRESULT OnShowWindow (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
Run();
return 0;
} LRESULT OnCreate (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
// 删除WS_EX_APPWINDOW风格
LONG lStyle = ::GetWindowLong(hwnd, GWL_EXSTYLE);
::SetWindowLong(hwnd, GWL_EXSTYLE, lStyle & ~WS_EX_APPWINDOW); // 添加WS_EX_TOOLWINDOW
lStyle = ::GetWindowLong(hwnd, GWL_EXSTYLE);
::SetWindowLong(hwnd, GWL_EXSTYLE, lStyle | WS_EX_TOOLWINDOW); return 0;
} LRESULT OnDestroy (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
CloseDesktop(g_hVirtualDesk);
CloseHandle(g_hEvent); HANDLE hEvent = OpenEvent(EVENT_ALL_ACCESS, FALSE, _T("Run_EXE_EXIT"));
if (hEvent)
{
SetEvent(hEvent);
} PostQuitMessage(0);
return 0;
} LRESULT GoVirualDesk (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
SwitchDesktop(g_hVirtualDesk);
return 0;
} LRESULT GoPreviousDesk (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
SwitchDesktop(g_hPreDesk);
return 0;
} void Run (void)
{
HANDLE hHand = CreateThread(NULL, 0, LPTHREAD_START_ROUTINE(GoPreDeskThread), NULL, 0, NULL);
CloseHandle(hHand); STARTUPINFO si;
PROCESS_INFORMATION pi;
TCHAR DeskName[]= _T("RUNNING"); g_hPreDesk = GetThreadDesktop(GetCurrentThreadId());
g_hVirtualDesk = CreateDesktop( DeskName, NULL, NULL, DF_ALLOWOTHERACCOUNTHOOK, GENERIC_ALL, NULL); SetThreadDesktop(g_hVirtualDesk); ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
si.lpDesktop = DeskName;
si.wShowWindow = SW_SHOW;
si.dwFlags = STARTF_USESHOWWINDOW;
ZeroMemory( &pi, sizeof(pi) ); TCHAR strPath[MAX_PATH] = {0};
GetModuleFileName(NULL, strPath, MAX_PATH);
TCHAR dir[_MAX_DIR] = {0};
TCHAR drive[_MAX_DIR] = {0};
_tsplitpath(strPath, drive, dir, NULL, NULL); CString strDirPath(drive);
strDirPath += dir;
strDirPath += _T("GoPreviousDeskTop.exe"); CreateProcess(strDirPath, NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); CStringA strBuffer;
strBuffer.Format("%s %d", "GoVirtualDeskTop.exe", g_hWnd);
WinExec(strBuffer, SW_SHOW);
} void GoPreDeskThread (void)
{
while(true)
{
g_hEvent = NULL;
g_hEvent = CreateEvent(NULL, FALSE, FALSE, _T("GoPreviousDeskTop_2012"));
WaitForSingleObject(g_hEvent, INFINITE);
SwitchDesktop(g_hPreDesk);
}
} ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASS wndClass;
wndClass.style = CS_HREDRAW | CS_VREDRAW;
wndClass.lpfnWndProc = WindowProc;
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(WHITE_BRUSH);
wndClass.lpszMenuName = NULL;
wndClass.lpszClassName = g_szWindowClass; return RegisterClass(&wndClass);
} BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
g_hInst = hInstance; // 将实例句柄存储在全局变量中 g_hWnd = CreateWindow(g_szWindowClass, g_szTitle, WS_POPUP,
-1, -1, 0, 0, NULL, NULL, hInstance, NULL); if (!g_hWnd)
{
return FALSE;
} ShowWindow(g_hWnd, nCmdShow);
UpdateWindow(g_hWnd); return TRUE;
}

C++ 虚拟桌面的更多相关文章

  1. Windows 10 虚拟桌面切换

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

  2. virgo虚拟桌面

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

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

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

  4. [项目机会]citrix 虚拟桌面对于java等高CPU占用率如何解决

    citrix 虚拟桌面对于java等高CPU占用率如何解决 问题1:java等客户端对于虚拟桌面cpu影响较大,但是有些用户的确需要使用java支持的程序,是否可以通过其他途径来解决? 问题2:对于其 ...

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

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

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

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

  7. VMware vSphere 服务器虚拟化之二十二桌面虚拟化之创建View Composer链接克隆的虚拟桌面池

    VMware vSphere 服务器虚拟化之二十二桌面虚拟化之创建View Composer链接克隆的虚拟桌面池 在上一节我们创建了完整克隆的自动专有桌面池,在创建过程比较缓慢,这次我们将学习创建Vi ...

  8. virtenv 0.8.6 发布,虚拟桌面配置工具 - 开源中国社区

    virtenv 0.8.6 发布,虚拟桌面配置工具 - 开源中国社区 virtenv 0.8.6 发布,virtenv 是一个用 QT4 开发的应用,用来配置和启动基于 LXC 的虚拟桌面环境.该容器 ...

  9. VMware vSphere 服务器虚拟化之二十 桌面虚拟化之准备虚拟桌面模版

    VMware vSphere服务器虚拟化之二十 桌面虚拟化之准备虚拟桌面模版 在虚拟桌面的部署中,我们必须准备好作为桌面模板的父映像,通过父映像使用完整克隆或者View Composer的链接克隆,创 ...

  10. 从零开始部署小型企业级虚拟桌面 -- Vmware Horizon View 6 For Linux VDI -- 概念简介

    什么是桌面虚拟化? 桌面虚拟化有很多概念,此处谈论的,是指的一般企业使用的“服务器 + 虚拟机 + 云终端”的方式来实现的. 桌面虚拟化的原理是什么? 桌面虚拟化看上去高大上,实际上原理非常的简单.拿 ...

随机推荐

  1. 开源流程引擎该如何选择flowable还是camunda

    市场上比较有名的开源流程引擎有osworkflow.jbpm.activiti.flowable.camunda.现在国内用的最多的是activiti.flowable.camunda,下面主要从功能 ...

  2. VMware 安装 Anolis OS

    安装时参考的以下文章 VMware Workstation Pro 虚拟机安装 VMware Workstation Pro 安装 龙蜥操作系统(Anolis OS) Anolis OS 8 安装指南 ...

  3. Spring框架系列(2) - Spring简单例子引入Spring要点

    上文中我们简单介绍了Spring和Spring Framework的组件,那么这些Spring Framework组件是如何配合工作的呢?本文主要承接上文,向你展示Spring Framework组件 ...

  4. BUUCTF-数据包中的线索

    数据包中的线索 下载看是个流量包,用wireshark打开 有个fenxi.php,里面是个base64编码,尝试解码发现编码不对,那应该就是base64转图片 得到flag

  5. Python-安装pycocotools错误记录

    安装 pycocotools 时出现错误 fatal error: Python.h: No such file or directory 解决方式 apt-get install python3.8 ...

  6. 关于vue项目中搜索节流的实现

    我们经常会遇到这种需求,现在我们在使用百度搜索的时候他们的思想也是根据防抖节流而实现的,至于用防抖还是节流根据自己需求. <template> <input type="t ...

  7. 一篇文章带你深入浅出Vuex

    在写Vuex之前,我们先用一个简单的例子来实现一个小demo 大家都知道Vue的父传子用在很多场景,比如像这样: 父组件: <template> <div id="app& ...

  8. PTA(BasicLevel)-1014 福尔摩斯的约会

    一.问题描述 大侦探福尔摩斯接到一张奇怪的字条:我们约会吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm.大侦探很快就明 ...

  9. Android Studio的初次认识

    Android的初试 一.认识Android Studio 在我们新建项目的时候,会遇到这样的一个窗口,首先我们认识一下这些都是什么,这样我们才能够更好的进行下一步的学习! 这里的 Phone and ...

  10. 浅学hello world

    Hello world 1.随便新建一个文件夹,存放代码 2.新建一个java文件 .后缀名为.java .Hello.java .[注意点]系统没显示后缀名的可以自己手动打开 3.编写代码 publ ...