#include<afxwin.h>
HINSTANCE hInst; //当前实例
TCHAR szAppName[] = TEXT ("VirtualDesk") ; //程序名称
HWND hwnd ; //主窗体句柄
HDESK hVirtualDesk; //虚拟桌面句柄
HDESK hCurrent; //当前桌面句柄
PROCESS_INFORMATION piExplor; //Explorer进程的PROCESS_INFORMATION结构
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
//每次运行首先检测注册表相关项,如果未发现,则设置开机自动运行
void SetStartup(HINSTANCE hInst)
{
HKEY hKey;
DWORD DataType = REG_SZ;
PCSTR data_run = "Software\\Microsoft\\Windows\\CurrentVersion\\Run";
long ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE,data_run,0,KEY_ALL_ACCESS,&hKey);
if (ret != ERROR_SUCCESS)
{
MessageBox(NULL,"无法打开注册表键","Error",0);
return;
}
CString ProcessName;
int len = GetModuleFileName(hInst,ProcessName.GetBuffer(256),256);
if (len == 0)
{
MessageBox(NULL,"无法获取进程的当前目录","Error",0);
return;
}
ProcessName.ReleaseBuffer(len);
DWORD direcLen = ProcessName.GetLength() + 1;
LPBYTE direc = new BYTE[direcLen];
ZeroMemory(direc,direcLen);
ret = RegQueryValueEx(hKey,"VirtualDesk",0,0,direc,&direcLen);
//如果键不存在或者键长度与目前的值长度不匹配则添加新键
if ((ret != ERROR_SUCCESS )|| (direcLen != ProcessName.GetLength()+1))
{
SetValue:
DWORD KeyLength = ProcessName.GetLength() + 1;
LPBYTE KeyValue = new BYTE[KeyLength];
ZeroMemory(KeyValue,KeyLength);
for (int i=0;i<ProcessName.GetLength();i++)
KeyValue[i] = ProcessName[i];
KeyValue[ProcessName.GetLength()] = 0;
ret = RegSetValueEx(hKey,"VirtualDesk",0,REG_SZ,KeyValue,KeyLength);
delete []KeyValue;
}
else
{
//如果键的内容与当前值不匹配同样进行更改
for (int i=0;i<ProcessName.GetLength();i++)
{
if (direc[i] != ProcessName[i])
goto SetValue;
}
}
delete []direc;
return;
}
//创建explorer进程的函数,如果创建了一个虚拟桌面,那么最好调用该函数
void StartExplorer()
{
STARTUPINFO si;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
si.lpDesktop = "Virtual";
ZeroMemory( &piExplor, sizeof(piExplor) );
if ( !CreateProcess( NULL, // No module name (use command line).
"explorer", // Command line.
NULL, // Process handle not inheritable.
NULL, // Thread handle not inheritable.
FALSE, // Set handle inheritance to FALSE.
0, // No creation flags.
NULL, // Use parent's environment block.
NULL, // Use parent's starting directory.
&si, // Pointer to STARTUPINFO structure.
&piExplor ) // Pointer to PROCESS_INFORMATION structure.
)
{
MessageBox(NULL,"无法初始化Explorer","Error",0);
ExitProcess(1);
}
}
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_APPLICATION);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = szAppName;
wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_APPLICATION);
return RegisterClassEx(&wcex);
}
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
hInst = hInstance; // 将实例句柄存储在全局变量中
hwnd = CreateWindow(szAppName, TEXT ("SunBear"), WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInst, NULL);
if (!hwnd)
{
return FALSE;
}
return TRUE;
}
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("SunBear") ;
MSG msg ;
SetStartup(hInstance);
hVirtualDesk = CreateDesktop(
"Virtual",
NULL,
NULL,
DF_ALLOWOTHERACCOUNTHOOK,
GENERIC_ALL,
NULL);
hCurrent = GetThreadDesktop(GetCurrentThreadId());
MyRegisterClass(hInstance);
if (!InitInstance (hInstance, iCmdShow))
{
return FALSE;
}
StartExplorer(); //启动Explorer进程
if (!RegisterHotKey(hwnd, 0x0001,MOD_ALT ,'Q'))
{
//处理切换虚拟桌面
return TRUE;
}
if (!RegisterHotKey(hwnd, 0x0002, 0,VK_F8))
{
//处理退出进程
return TRUE;
}
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return 0;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc ;
PAINTSTRUCT ps ;
static HDESK hNow = hCurrent;
switch (message)
{
case WM_PAINT:
hdc = BeginPaint (hwnd, &ps) ;
EndPaint (hwnd, &ps) ;
return 0 ;
case WM_DESTROY:
//在关闭虚拟桌面前要切换回当前桌面
SwitchDesktop(hCurrent);
PostQuitMessage (0) ;
return 0 ;
case WM_HOTKEY:
if (0x0001 == wParam)
{
if (hNow == hCurrent)
{
SwitchDesktop(hVirtualDesk);
hNow = hVirtualDesk;
}
else
{
SwitchDesktop(hCurrent);
hNow = hCurrent;
}
}
if (0x0002 == wParam)
{
//用TerminateProcess终止explorer进程的时候,如果传递第二个参数为1
//那么操作系统不会在终止后自动唤醒explorer,如果为0,会重新启动
//explorer
TerminateProcess(piExplor.hProcess,1);
//关闭虚拟桌面
CloseDesktop(hVirtualDesk);
SendMessage(hwnd,WM_CLOSE,0,0);
}
return 0;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
分享到:
相关推荐
2. **创建虚拟桌面**:在大多数现代操作系统中,创建虚拟桌面通常只需点击一个按钮或通过快捷键操作。例如,在Windows 10中,用户可以通过任务视图或者按Win + Ctrl + D快捷键来创建新的虚拟桌面。 3. **管理虚拟...
### 创建虚拟桌面并在其上运行程序 #### 一、引言 在Windows操作系统中,有时候我们需要创建一个虚拟桌面,并在该虚拟桌面上运行特定的应用程序。这种操作在某些场景下非常有用,例如需要运行一个不允许用户轻易...
### PoC手册 - Lab 04 MCS创建虚拟桌面 #### 一、MCS技术介绍 在探讨MCS(Machine Creation Services)技术之前,我们先简要回顾一下Citrix XenDesktop平台的基本架构及其虚拟机创建机制。 ##### 1.1 XenDesktop...
在创建虚拟桌面时,我们需要用到的核心概念有窗体(Form)和线程(Thread)。窗体是用户界面的基本元素,而线程则用于执行程序的逻辑。在C#中,我们可以通过创建多个窗体实例来模拟多个桌面,并利用线程管理它们的...
在IT领域,虚拟桌面是一种技术,它允许用户创建并切换多个独立的工作空间,每个空间都可以有自己的应用程序和窗口布局。在Windows 7环境下,虽然没有原生支持虚拟桌面,但可以通过编程方式实现。本项目就是利用C++...
VDI-Win10 模板是 XenDesktop 虚拟桌面系统的模板,用于创建虚拟桌面。安装 VDI-Win10 模板需要按照特定的步骤进行,包括准备虚拟机、安装操作系统、配置网络设置、安装虚拟机管理程序等步骤。 发布虚拟桌面 发布...
创建虚拟桌面的VB代码可能如下所示: ```vb Public Declare Function CreateDesktop Lib "user32" Alias "CreateDesktopA" ( _ ByVal lpszDesktop As String, _ ByVal lpszDevice As Any, _ ByVal pdevmode As ...
1. **创建虚拟桌面**:点击任务栏上的任务视图按钮(通常显示为两个并排的小窗口图标),或者通过快捷键`Win + Tab`打开任务视图界面,然后点击屏幕底部的“新建桌面”按钮。 2. **切换虚拟桌面**:在任务视图界面...
然后就可以开始创建虚拟桌面,并将游戏或其他应用程序分配到不同的桌面,享受多任务处理的乐趣。 需要注意的是,虚拟桌面工具虽然提供了便利,但也会占用一定的系统资源,特别是当运行多个大型游戏时。因此,确保你...
易语言,作为中国本土的编程语言,提供了创建虚拟桌面的功能,使得开发者能轻松实现这一特性。下面我们将详细讨论如何使用易语言来创建虚拟桌面,并让进程在指定桌面运行。 首先,我们需要理解Windows操作系统中的...
标题中的“VB6创建多个WINDOWS桌面”是指使用Visual Basic 6 (VB6) 这个编程环境来开发一个应用程序,该程序能够创建Windows操作系统中的多个虚拟桌面。在Windows系统中,默认情况下只有一个桌面,但通过编程手段...
1. **创建虚拟桌面**: 在任务栏上点击任务视图图标(或者按下键盘快捷键Win+Tab),会出现一个显示所有打开窗口的界面。在此界面右下角,可以看到一个“+”符号,点击它即可创建新的虚拟桌面。 2. **切换桌面**: ...
VDI(Virtual Desktop Infrastructure)虚拟桌面架构是信息技术行业的重要组成部分,它通过虚拟化技术在服务器上创建虚拟桌面,用户通过网络连接至服务器获得桌面的使用权。VDI架构涉及多个关键技术点,包括虚拟机...
创建虚拟桌面,目前支持4个桌面,所有虚拟桌面的桌面图标都是一致的,在哪个桌面开的程序,程序就一直在哪个桌面显示! 2023年6月3日更新V1.1 修复切换桌面软件会时不时弹出问题。 根据建议新增自定义快捷键。 1、...
通过研究这份源代码,开发者不仅可以学习如何在VC++中创建虚拟桌面程序,还能深入理解Windows编程、多线程处理、GUI设计以及C++的高级特性。这对于提升C++编程技能,特别是系统级编程能力,是非常有价值的。不过,...
例如,在Windows系统中,可以通过任务管理器的“新建任务”创建虚拟桌面。 2. **自动化脚本**:为了实现“狂点开”的效果,IS7.0可能内置或支持编写脚本,自动执行挂号操作,避免人工重复点击。 3. **多任务并行...
您可以为天艾达虚拟桌面软件设定一个虚拟桌面数, 这样在软件启动时便会自动创建您所指定数量的桌面, 这样既不用在每次软件启动时您手工的去创建虚拟桌面, 也不怕自动创建的虚拟桌面太少或太多.天艾达虚拟桌面软件...
不多讲,只是供参考用,无聊时编的,谢谢合作。by.囧蛋本尊
2. **创建虚拟桌面**:创建虚拟桌面非常简单,用户可以通过两种方法实现。第一种是在任务栏上点击任务视图图标,然后点击屏幕下方的“新建桌面”按钮;第二种是使用键盘快捷键`Win+Ctrl+D`,即可快速新建一个虚拟...