`
hcmfys
  • 浏览: 357619 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

创建虚拟桌面

阅读更多

#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创建虚拟桌面.docx

    ### PoC手册 - Lab 04 MCS创建虚拟桌面 #### 一、MCS技术介绍 在探讨MCS(Machine Creation Services)技术之前,我们先简要回顾一下Citrix XenDesktop平台的基本架构及其虚拟机创建机制。 ##### 1.1 XenDesktop...

    c# 源码 winform VirtualDeskTop 虚拟桌面 多个桌面 适合开很多窗口的朋友 源码

    在创建虚拟桌面时,我们需要用到的核心概念有窗体(Form)和线程(Thread)。窗体是用户界面的基本元素,而线程则用于执行程序的逻辑。在C#中,我们可以通过创建多个窗体实例来模拟多个桌面,并利用线程管理它们的...

    C++虚拟桌面,实现桌面的切换等

    在IT领域,虚拟桌面是一种技术,它允许用户创建并切换多个独立的工作空间,每个空间都可以有自己的应用程序和窗口布局。在Windows 7环境下,虽然没有原生支持虚拟桌面,但可以通过编程方式实现。本项目就是利用C++...

    Citrix桌面虚拟化项目手册-XenDesktop虚拟桌面的交付.pdf

    VDI-Win10 模板是 XenDesktop 虚拟桌面系统的模板,用于创建虚拟桌面。安装 VDI-Win10 模板需要按照特定的步骤进行,包括准备虚拟机、安装操作系统、配置网络设置、安装虚拟机管理程序等步骤。 发布虚拟桌面 发布...

    虚拟桌面 vb代码 api

    创建虚拟桌面的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桌面,可用热键切换,同时示范了在新桌面上运行程序

    标题中的“VB6创建多个WINDOWS桌面”是指使用Visual Basic 6 (VB6) 这个编程环境来开发一个应用程序,该程序能够创建Windows操作系统中的多个虚拟桌面。在Windows系统中,默认情况下只有一个桌面,但通过编程手段...

    Desktops(Windows虚拟桌面创建工具)

    1. **创建虚拟桌面**: 在任务栏上点击任务视图图标(或者按下键盘快捷键Win+Tab),会出现一个显示所有打开窗口的界面。在此界面右下角,可以看到一个“+”符号,点击它即可创建新的虚拟桌面。 2. **切换桌面**: ...

    VDI虚拟桌面架构及其应用-整合版本

    VDI(Virtual Desktop Infrastructure)虚拟桌面架构是信息技术行业的重要组成部分,它通过虚拟化技术在服务器上创建虚拟桌面,用户通过网络连接至服务器获得桌面的使用权。VDI架构涉及多个关键技术点,包括虚拟机...

    虚拟桌面 桌面分身 一键切换桌面

    创建虚拟桌面,目前支持4个桌面,所有虚拟桌面的桌面图标都是一致的,在哪个桌面开的程序,程序就一直在哪个桌面显示! 2023年6月3日更新V1.1 修复切换桌面软件会时不时弹出问题。 根据建议新增自定义快捷键。 1、...

    VC++写的虚拟桌面程序源代码

    通过研究这份源代码,开发者不仅可以学习如何在VC++中创建虚拟桌面程序,还能深入理解Windows编程、多线程处理、GUI设计以及C++的高级特性。这对于提升C++编程技能,特别是系统级编程能力,是非常有价值的。不过,...

    虚拟桌面IS7.0挂号

    例如,在Windows系统中,可以通过任务管理器的“新建任务”创建虚拟桌面。 2. **自动化脚本**:为了实现“狂点开”的效果,IS7.0可能内置或支持编写脚本,自动执行挂号操作,避免人工重复点击。 3. **多任务并行...

    天艾达虚拟桌面软件 v1.0.0.4.zip

    您可以为天艾达虚拟桌面软件设定一个虚拟桌面数, 这样在软件启动时便会自动创建您所指定数量的桌面, 这样既不用在每次软件启动时您手工的去创建虚拟桌面, 也不怕自动创建的虚拟桌面太少或太多.天艾达虚拟桌面软件...

    易语言虚拟桌面切换

    不多讲,只是供参考用,无聊时编的,谢谢合作。by.囧蛋本尊

    win10系统虚拟桌面是什么?.docx

    2. **创建虚拟桌面**:创建虚拟桌面非常简单,用户可以通过两种方法实现。第一种是在任务栏上点击任务视图图标,然后点击屏幕下方的“新建桌面”按钮;第二种是使用键盘快捷键`Win+Ctrl+D`,即可快速新建一个虚拟...

Global site tag (gtag.js) - Google Analytics