|
虚拟一个桌面,然后在虚拟桌面启动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; }
共2页: 上一页 1 [2] 下一页
| |