一个虚拟桌面程序的实现

        前几天为朋友写了一个小工具,主要是为了做到一键隐藏大智慧炒股软件,第一个版本是利用窗口查找,然后向窗口发送WM_SHOW消息完成的。实现原理虽然简单,但是不具备通用性,按我最初的设想要一键隐藏什么软件应该由用户定义,而不是每次都要定制。于是这个小工具的第二个版本诞生了,那就是为用户虚拟一个桌面,然后在虚拟桌面启动explorer进程,用户可以用"ALT+Q"来切换现有桌面与这个虚拟桌面,用户需要运行什么软件,自己在虚拟桌面打开就是了。原理很简单,实现同样也很简单,下面是代码:

/*******************************************************************************



Module:		SunBear.cpp



Date:		2008/06/13



Notice:		Copyright (C)	2008	常海龙



*******************************************************************************/



#include



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

 

你可能感兴趣的:(一个虚拟桌面程序的实现)