C语言实现的虚拟桌面程序代码

虚拟一个桌面,然后在虚拟桌面启动explorer进程,用户可以用"ALT+Q"来切换现有桌面与这个虚拟桌面,用户需要运行什么软件,自己在虚拟桌面打开就是了。原理很简单,实现同样也很简单,下面是代码:

#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) ;
}

时间: 2024-10-14 07:20:58

C语言实现的虚拟桌面程序代码的相关文章

一种高效的面向虚拟桌面恶意代码检测机制

一种高效的面向虚拟桌面恶意代码检测机制 郭煜  石勇 与传统的恶意代码检测方式相比,面向虚拟桌面的恶意代码检测方法面临着性能方面的挑战,同一物理服务器上多个虚拟桌面同时开展恶意代码检测使得磁盘等硬件成为严重的IO性能瓶颈.本文提出了一种高效的虚拟桌面恶意代码检测方案,基于母本克隆技术的虚拟桌面恶意代码检测机制(MCIDS),MCIDS根据虚拟桌面系统的特点,通过系统映像网络存储克隆技术以及部署在网络存储系统中的恶意代码引擎减少虚拟桌面系统中的恶意代码检测范围,有效减少恶意代码检测所需的磁盘IO开

C语言 实现N阶乘的程序代码_C 语言

代码如下所示: 复制代码 代码如下: #include <stdio.h>#include <stdlib.h>#define N 10 //算N的阶乘int main(){       //数组   1位 1!    int ary[N] = {1, 1};    int i, j;    for (i = 2; i <= N; i++)    {        //各个下标的阶乘,第0位下标是位数,所以从第1位开始        for (j = 1; j <= a

设计-学生在线答疑排队模拟C语言版的程序代码有木有呢?

问题描述 学生在线答疑排队模拟C语言版的程序代码有木有呢? 程序设计思路: 1.主函数main( ),打印输出主控程序菜单选项,并接收用户的选择项 2.定义学生信息(学号.姓名)的数据存储结构 3.设计学生在线答疑排队模拟程序的功能函数EnQueue( ),处理新学生加入排队的情况 4.设计学生在线答疑排队模拟程序的功能函数AnsQ( ),处理队列中第一个学生出队列答疑的情况 5.设计功能函数PrintQ( ),输出队列中所有正在排队的学生信息. 6.当用户退出答疑程序时,检查队列是否为空.如仍

简单数字钟-求一基于AT89C52的数字钟设计的C语言程序代码,图已做好,有流程图和项目要求,跪求大神帮忙!!!

问题描述 求一基于AT89C52的数字钟设计的C语言程序代码,图已做好,有流程图和项目要求,跪求大神帮忙!!! 麻烦大神最好能把程序与图匹配符合要求就好了 一会把图和要求发在下面 解决方案 解决方案二: 解决方案三: 解决方案四: 解决方案五: 再次感谢,求帮忙,求助攻,求各种

编程c语言-求二叉树问题的C程序代码

问题描述 求二叉树问题的C程序代码 //从终端输入一个整数序列,构建一棵允许具有重复结点的二叉排序树(左子树元素小,右子树不小): //(1) 使用依次插入元素的方法(InsertBST)构建二叉排序树: //(2) 分别写出二叉树的前序.中序.后序遍历递归算法: //(3) 写出前序遍历序列的非递归算法(使用以前写好的堆栈代码): //(4) 使用递归算法求该二叉树中叶子结点和非叶子结点的个数: //(5) 使用递归算法求该二叉树的高度: //(6) 层次遍历该二叉树(使用以前写好的队列代码)

c语言-OpenGL三维齿轮程序代码

问题描述 OpenGL三维齿轮程序代码 急需OpenGL齿轮程序代码,三维的,老师布置的任务 我是个初学者 不知道怎么编程 需高手帮忙 谢谢! 解决方案 http://wenku.baidu.com/link?url=6cHl8C8YfBMEAwelxW6C4R5_tWfj5Kg8dZ9CH8joSdq2yQKmMqRaMdQ2sNG3dl9Lw68x9oLUYwlJbjnVlqVOT-jyo_5oT_-KLZnNAU2dxj7

c语言-请高手看一段C程序代码不知道哪里出错了

问题描述 请高手看一段C程序代码不知道哪里出错了 解决方案 另外printf你又拼错了. 解决方案二: 第14行 应为printf 解决方案三: 你的那个所谓的山寨编译器,也不知道有没有windows.h,估计没有. 建议你使用VC++ 解决方案四: 这本书其实我也看过,作者自己做了一个所谓的开发环境,其实用的是GNU C++,它并不包含windows的api函数的头和库. 解决方案五: 出错信息呢,贴出来呗 解决方案六: 你第14行的 printf 写错了 解决方案七: 第14行的printf

实现下载到桌面快捷方式程序代码

 代码如下 复制代码 <% id=request("id") liehuo_net_url=request("liehuo_net_url") If liehuo_net_url="" Then liehuo_net_url="挖坑部落" Shortcut = "[InternetShortcut] " & vbCrLf Shortcut = Shortcut & "URL=

c语言-让电脑锁屏并提示密码解屏,这个c程序代码是什么?

问题描述 让电脑锁屏并提示密码解屏,这个c程序代码是什么? 求锁屏代码和解屏代码!解屏的密码自己设置,,在没有输入正确的密码之前,屏幕一直处于锁屏状态! 解决方案 创建一个和屏幕一般大小的窗口,添加ws_ex_topmost属性让窗口一直在最前面 解决方案二: #include <Windows.h> #include <Winuser.h> void main() { LockWorkStation(); } 解决方案三: #include <Windows.h> #