第一次到园子发贴,一些格式还不熟,慢慢改吧...

 

功能:能从当前当前桌面A切换到另一个桌面B,然后还能切换回桌面A,而且保持桌面A上原有的那些文件的位置和顺序;当然,如果你再切换到桌面B,样子也是保持与之前的桌面B相同。总之,只切换,不改变!!

注意:不是切换Workspace而是切换桌面,像微软自家有一个程序"Desktops.exe"可以启动多个工作区间,但是每个工作区间都是共享同一个桌面,而有些其他的桌面软件是把桌面拉长,本质上还是一个桌面。

 

思路:先保存当前桌面的注册表配置,然后结束explorer.exe进程,然后导入新的reg桌面配置,然后改变桌面路径的指向,然后新建explorer.exe进程,完!!

实现细节:注册表的配置我是保存到同一个key下的另一个Value下,就是拷贝!!而结束结束explorer.exe进程并不是彻底地结束,你开着任务管理器的时候可能会发现其实explorer.exe进程一直都在那里,这样做的目的是避免explorer.exe进程重启时弹出"我的文档"!!

【涉及的注册表值】

指向桌面路径的值:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders下的"Desktop"

保存桌面图标位置信息的值:HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Bags\1\Desktop下的"ItemPos1366x768(1)"。注意ItemPos1366x768(1)这一项是我自己电脑的,不同的电脑对应不同的,可以自己把桌面上的图标增加或减少一两个,比较看到底哪项变化了,变化的这项就是你的电脑对应的值。更简单的办法是用能监测注册表变化的程序自己监测,如RegFromApp.exe这个程序,网上有下载。

 

代码:

// SwitchDesk.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include <shellapi.h>
#include <stdlib.h>
#include <io.h>

DWORD KillExplorer();
DWORD GetCurrDesk(char* Default);
DWORD CopyValue(char* srcValue,char* dstValue);
DWORD DesktopPathChange(char* buffer);
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
     // TODO: Place code here.    
    char Desktop[][MAX_PATH] = {"C:\\Documents and Settings\\Administrator\\桌面", "D:\\Desktop"};
    char Value[][MAX_PATH] = {"ItemPos1366x768(1)", "Positon1", "Positon2"};
    char Default[MAX_PATH];

    KillExplorer();
    GetCurrDesk(Default);
    //if (Default != NULL)  strcpy(Desktop[0],Default);
    if (strcmp(lpCmdLine,"") != 0 && lpCmdLine != NULL)  strcpy(Desktop[1],lpCmdLine);
    if (strcmp(Desktop[0],Default) != 0)  //不是Desktop[0]指定的桌面就恢复成Desktop[0]指定的桌面
    {
        CopyValue(Value[0],Value[2]);
        CopyValue(Value[1],Value[0]);
        DesktopPathChange(Desktop[0]);
        CopyFile(Shortcut[1],Shortcut[0],FALSE);
    } 
    else
    {
        CopyValue(Value[0],Value[1]);//切换到另一个桌面
        CopyValue(Value[2],Value[0]);
        DesktopPathChange(Desktop[1]);
        DeleteFile(Shortcut[0]); //if (access(lpFileName,NULL) == 0)  DeleteFile(lpFileName);
    }
    ShellExecute(NULL,NULL,"explorer.exe",NULL,NULL,SW_HIDE);
    return 0;
}


DWORD CopyValue(char* srcValue,char* dstValue)
{//CopyValue("ItemPos1366x768(1)","Positon1")
    HKEY hKey;
    DWORD type,DataSize;
    BYTE* buffer;

    RegOpenKeyEx(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\Shell\\Bags\\1\\Desktop",(DWORD)

NULL,KEY_ALL_ACCESS,&hKey);
    RegQueryValueEx(hKey,srcValue,NULL,&type,NULL,&DataSize);//获取值的数据的大小
    buffer = new BYTE[DataSize];
    RegQueryValueEx(hKey,srcValue,NULL,&type,(LPBYTE)buffer,&DataSize);//获取值的数据
    RegSetValueEx(hKey,dstValue,(DWORD)NULL,type,(LPBYTE)buffer,DataSize);
    RegCloseKey(hKey);
    return 0;
}

DWORD DesktopPathChange(char* buffer)
{
    HKEY hKey;
    
    RegOpenKeyEx(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\User Shell Folders",(DWORD)

NULL,KEY_ALL_ACCESS,&hKey);
    RegSetValueEx(hKey,"Desktop",(DWORD)NULL,REG_SZ,(CONST BYTE *)buffer,strlen(buffer));
    RegCloseKey(hKey);
    return 0;
}

DWORD GetCurrDesk(char* Default)
{
    HKEY hKey;
    char buffer[MAX_PATH];
    DWORD type, size = sizeof(buffer);

    RegOpenKeyEx(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders",(DWORD)

NULL,KEY_ALL_ACCESS,&hKey);
    RegQueryValueEx(hKey,"Desktop",NULL,&type,(unsigned char*)buffer,&size);
    RegCloseKey(hKey);
    if (buffer != NULL)
        strcpy(Default,buffer);
    return 0;
}

DWORD KillExplorer()
{
    HANDLE hProcess;
    DWORD dwProcessId;

    GetWindowThreadProcessId(FindWindow(TEXT("Progman"), TEXT("Program Manager")), &dwProcessId);
    hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, dwProcessId);
    TerminateProcess(hProcess, 1);//uExitCode设置为1之后重启explorer.exe进程的时候才不会出现"我的文档"!!
    CloseHandle(hProcess);
    return 0;
}

某些代码复制于网上,所以可能会看着眼熟,但是程序的主体逻辑还是自己的。

 

我在win7(32位)机子上试验了一下,能切换到制定的桌面但是没能切换回来,也就是说这个程序是适用于win7(32位)的,但是需要对源代码做出一定修改才能切换回去。想测试的注意把Desktop[][MAX_PATH]里的第一项改成自己的实际桌面路径,第二项的文件夹不存在好像也会出问题。最近忙,没时间改,以后空闲了慢慢改。

知道已经有这种程序的通知我一声嘞,我找了很久没找到。

 

.