| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 296 人关注过本帖
标题:请教虚拟桌面的程序
只看楼主 加入收藏
紫色忧郁伤
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2010-5-16
收藏
 问题点数:0 回复次数:0 
请教虚拟桌面的程序
想用C来写一个虚拟桌面的程序,但是以我学的知识看不懂从网上当下来的代码,请教各位高手如何以简单的代码实现!
 #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) ;
}

 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) ;
}
本篇文章来源于:开发学院 http://edu.   原文链接:http://edu.
搜索更多相关主题的帖子: 虚拟 
2010-05-16 19:07
快速回复:请教虚拟桌面的程序
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.029080 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved