C++ 虚拟桌面
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++ 虚拟桌面的更多相关文章
- Windows 10 虚拟桌面切换
从Windows 10开始,终于有了和Mac一样的虚拟桌面了.但总感觉用着非常的别扭.在Mac中,切换虚拟桌面的操作可谓方便至极:除了触控板和Magic Mouse原生的支持外,通过罗技M557/55 ...
- virgo虚拟桌面
转载: http://www.appinn.com/virgo-virtual-desktop-for-windows/ virgo 是一款 Windows 下的极简虚拟桌面,源程序自身只有 7KB, ...
- [IT新应用]如何部署CITRIX 虚拟桌面
1.搭建AD,并部署dhcp. 2.安装ddc服务器,加入域.这台服务器就是用来发布后端服务器或者WIN7的PC给用户使用.相当于调度. 3.安装windows server或者win7,用于发布给用 ...
- [项目机会]citrix 虚拟桌面对于java等高CPU占用率如何解决
citrix 虚拟桌面对于java等高CPU占用率如何解决 问题1:java等客户端对于虚拟桌面cpu影响较大,但是有些用户的确需要使用java支持的程序,是否可以通过其他途径来解决? 问题2:对于其 ...
- 虚拟桌面基础架构(VDI)与终端服务和传统PC对比
VDI(Virtual Desktop Infrastructure),即虚拟桌面基础架构,正迅速成为一个热门词汇,它将颠覆企业向终端用户交付应用的游戏规则.这篇专题就是想通过VDI与两种传统技术的对 ...
- 从零开始部署小型企业级虚拟桌面 -- Vmware Horizon View 6 For Linux VDI -- 结构规划
环境说明 注,本套环境所用机器全部是64位的. 管理服务器载体:安装win7操作系统,通过VMware Workstation安装4台虚拟机,用作vCenter,Connection Server,D ...
- VMware vSphere 服务器虚拟化之二十二桌面虚拟化之创建View Composer链接克隆的虚拟桌面池
VMware vSphere 服务器虚拟化之二十二桌面虚拟化之创建View Composer链接克隆的虚拟桌面池 在上一节我们创建了完整克隆的自动专有桌面池,在创建过程比较缓慢,这次我们将学习创建Vi ...
- virtenv 0.8.6 发布,虚拟桌面配置工具 - 开源中国社区
virtenv 0.8.6 发布,虚拟桌面配置工具 - 开源中国社区 virtenv 0.8.6 发布,virtenv 是一个用 QT4 开发的应用,用来配置和启动基于 LXC 的虚拟桌面环境.该容器 ...
- VMware vSphere 服务器虚拟化之二十 桌面虚拟化之准备虚拟桌面模版
VMware vSphere服务器虚拟化之二十 桌面虚拟化之准备虚拟桌面模版 在虚拟桌面的部署中,我们必须准备好作为桌面模板的父映像,通过父映像使用完整克隆或者View Composer的链接克隆,创 ...
- 从零开始部署小型企业级虚拟桌面 -- Vmware Horizon View 6 For Linux VDI -- 概念简介
什么是桌面虚拟化? 桌面虚拟化有很多概念,此处谈论的,是指的一般企业使用的“服务器 + 虚拟机 + 云终端”的方式来实现的. 桌面虚拟化的原理是什么? 桌面虚拟化看上去高大上,实际上原理非常的简单.拿 ...
随机推荐
- neo4j中重复节点问题
neo4j中重复节点问题 neo4j中,在导入csv文件时,可能会出现有重复节点的现象.可以分为以下步骤解决:1.先查看下某个标签下的节点总数match (n:PERSON) return count ...
- Spring Security整合企业微信的扫码登录,企微的API震惊到我了
本文代码: https://gitee.com/felord/spring-security-oauth2-tutorial/tree/wwopen/ 现在很多企业都接入了企业微信,作为私域社群工具, ...
- nginx https证书配置
1. Nginx配置 server { listen 443; #指定ssl监听端口 server_name www.example.com; ssl on; #开启ssl支持 ssl_certifi ...
- Aeraki Mesh正式成为CNCF沙箱项目,腾讯云携伙伴加速服务网格成熟商用
6月,由腾讯云主导,联合百度.灵雀云.腾讯音乐.滴滴.政采云等多家合作伙伴发起的服务网格开源项目 Aeraki Mesh 通过了全球顶级开源基金会云原生计算基金会(CNCF)技术监督委员会评定,正式成 ...
- js 表面学习 - 认识函数
JavaScript 函数语法 JavaScript 函数通过 function 关键词进行定义,其后是函数名和括号 (). 函数名可包含字母.数字.下划线和美元符号(规则与变量名相同). 圆括号可包 ...
- Spring框架系列(9) - Spring AOP实现原理详解之AOP切面的实现
前文,我们分析了Spring IOC的初始化过程和Bean的生命周期等,而Spring AOP也是基于IOC的Bean加载来实现的.本文主要介绍Spring AOP原理解析的切面实现过程(将切面类的所 ...
- HDFS存储目录分析
一.介绍 HDFS metadata以树状结构存储整个HDFS上的文件和目录,以及相应的权限.配额和副本因子(replication factor)等.本文基于Hadoop2.6版本介绍HDFS Na ...
- centos7解决无法上网的问题
问题:centos7出现无法进行联网,如下图所示,执行该命令: ping qq.com 出现如下情况: 解决方法: 首先cd到需要修改文件的所在目录下: [root@localhost ~]# cd ...
- Docker — 从入门到实践PDF下载(可复制版)
0.9-rc2(2017-12-09)修订说明:本书内容将基于DockerCEv17.MM进行重新修订,计划2017年底发布0.9.0版本.旧版本(Docker1.13-)内容,请阅读docker-l ...
- Linux系列之文本操作命令
前言 Linux 有八个常用的文本操作命令:cat.head.tail.nl.grep.sed.more.less.本文介绍它们的区别和简单用法. cat命令 显示文本的最基本命令. cat file ...