首页
社区
课程
招聘
[分享]放假休息有时间看了看32位的高版本系统下创建新桌面的问题
发表于: 2013-4-30 14:02 8431

[分享]放假休息有时间看了看32位的高版本系统下创建新桌面的问题

2013-4-30 14:02
8431
本代码不适合x64的os,想要兼容x64的os请自己改改~~
// test03.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <windows.h>
#include <Sddl.h>
#include <AclAPI.h>
const TCHAR newDesk[MAX_PATH]=TEXT("FuckApp");
BOOL IsHighOS()
{
	if (GetVersion()>=6)
	{
		return TRUE;
	}
	return FALSE;
}
HDESK CreateNewDesktop(LPCTSTR lpszDeskName)
{
	HDESK hdesk = CreateDesktop(lpszDeskName,NULL,NULL,0,GENERIC_ALL,NULL);
	if (hdesk)
	{
		BOOL bRet=FALSE;
		PSECURITY_DESCRIPTOR SecDes=NULL;
		bRet = ConvertStringSecurityDescriptorToSecurityDescriptor(TEXT("S:(ML;;NW;;;LW)"),SDDL_REVISION_1,&SecDes,NULL);
		if (bRet)
		{
			BOOL bSaclDefaulted=FALSE; 
			BOOL bSaclPresent=FALSE;
			PACL SecACL=NULL;
			bRet = GetSecurityDescriptorSacl(SecDes,&bSaclPresent,&SecACL,&bSaclDefaulted);
			if (bRet)
			{
				if(ERROR_SUCCESS==SetSecurityInfo(hdesk,SE_WINDOW_OBJECT,0x10,NULL,NULL,NULL,SecACL))
					return hdesk;
			}
		}
		CloseDesktop(hdesk);
	}
	return 0;
}
DWORD WINAPI NewExplorerThread(LPVOID lparam)
{
	HDESK hHandle = (HDESK)lparam;
	SetThreadDesktop(hHandle);
	if (!FindWindow(TEXT("Shell_TrayWnd"),NULL))
	{
		//创建一个Explorer起来
		TCHAR szExplorerFullPath[MAX_PATH];
		STARTUPINFO si;
		PROCESS_INFORMATION pi;
		GetSystemDirectory(szExplorerFullPath,MAX_PATH);
		_tcsncat(szExplorerFullPath,TEXT("\\Explorer.exe"),MAX_PATH);
		si.cb = sizeof(STARTUPINFO);
		GetStartupInfo(&si);
		si.lpDesktop = (LPTSTR)newDesk;
		si.dwFlags = 1;
		si.wShowWindow = SW_SHOW;
		RtlZeroMemory(&pi,sizeof(PROCESS_INFORMATION));
		if (CreateProcess(NULL,szExplorerFullPath,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi))
		{
			CloseHandle(pi.hProcess);
			CloseHandle(pi.hThread);
		}
		while (!FindWindow(TEXT("Shell_TrayWnd"),NULL))
		{
			Sleep(2000);
		}
		if (IsHighOS())
		{
			//高版本系统处理explorer的问题
			HWND hWnd = FindWindow(TEXT("Shell_TrayWnd"),NULL);
			PostMessage(hWnd,0x574,2,0);
                        PostMessage(hWnd, 0x112u, 0xF130u, 0);
		}
	}
	return 0;
}
BOOL MakeDesktop(HDESK hDesk,DWORD dwSetting)
{
	SwitchDesktop(hDesk);
	SetThreadDesktop(hDesk);
	if (IsHighOS())
	{
		//写入Setting就行吧?
		//具体记不起来!
		HKEY hKey;
		DWORD dwData =0;
		if (!RegOpenKeyEx(
			HKEY_CURRENT_USER,
			TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer"),
			0,
			KEY_ALL_ACCESS,
			&hKey) )
		{
			dwData = dwSetting;
			RegSetValueExW(hKey, L"AltTabSettings",0,REG_DWORD,(const BYTE *)&dwData,sizeof(DWORD));
			RegCloseKey(hKey);
		}
	}
	HANDLE hThread = CreateThread(NULL,0,NewExplorerThread,(LPVOID)hDesk,0,NULL);
	WaitForSingleObject(hThread,INFINITE);
	return TRUE;
}
DWORD GetExplorerSetting()
{
	DWORD cbData=0;
	DWORD Data=0;
	HKEY hKey;
	if (!RegOpenKeyEx(
		HKEY_CURRENT_USER,
		TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer"),
		0,
		KEY_ALL_ACCESS,
		&hKey) )
	{
		cbData = sizeof(DWORD);
		RegQueryValueEx(hKey, TEXT("AltTabSettings"), 0,NULL,(LPBYTE)&Data,&cbData);
		RegCloseKey(hKey);
	}
	return Data;
}
int _tmain(int argc, _TCHAR* argv[])
{
	DWORD DeskSwitch = GetExplorerSetting();
	HDESK hDesk = CreateNewDesktop(newDesk);
	if (hDesk)
	{
		MakeDesktop(hDesk,DeskSwitch);
	}
	return 0;
}


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 387
活跃值: (66)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
非常感谢哦。V大,不仅技术牛,而且还没架子,真的非常感谢。
2013-4-30 15:52
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
3
第一我今天有点时间,
第二无关于我自身的利益,
第三写些代码不是什么大事儿。

仅此而已。
2013-4-30 17:58
0
雪    币: 14
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
真诚膜拜!!
2013-5-1 23:29
0
雪    币: 298
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
沙发昨天发问,今天老V就上马。够专业~~
2013-5-1 23:34
0
雪    币: 1042
活跃值: (500)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
V大好人一生平安。马克
2013-5-2 13:37
0
雪    币: 244
活跃值: (63)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
好吧,楼主大亮啦~
2013-5-2 16:31
0
雪    币: 148
活跃值: (278)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
LS的说话好阴
2013-5-4 17:12
0
雪    币: 276
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
这个派什么用处的?
2013-5-4 17:14
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
10
回答某人的问题而已~
2013-5-5 07:39
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
11
32位的高版本系统下创建新桌面  mark~~
2013-5-5 14:34
0
雪    币: 6723
活跃值: (1199)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
mark 留名,非常不错,嘿嘿......
2013-5-10 11:08
0
雪    币: 34
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
留名,膜拜v大
2013-6-3 11:21
0
雪    币: 220
活跃值: (117)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
14
某些特殊情况下.
会返回内存不足的问题...

不知道怎么解决
2013-6-3 12:20
0
游客
登录 | 注册 方可回帖
返回
//