windows虚拟桌面例子


#include <iostream>
#include<windows.h>

TCHAR szAppName[] = TEXT("TEST");		//窗口类名

#define DESTOP_NAME  TEXT("MY_DESTOP")	//定义我要创建的桌面名称

ATOM m_HotKeyId1;			//用于注册ctrl+shift+F6  ,切换到原来的活动桌面
ATOM m_HotKeyId2;			//用于注册ctrl+shift+F7	,将活动桌面切换到我们新创建的桌面,
ATOM m_HotKeyId3;			//用于正确退出程序,因为程序没有相应界面且需要释放一些资源
HDESK hDDesk;

//HWINSTA  hWinStaThisProcess = GetProcessWindowStation();			//程序运行起来,获取系统为该进程设置的默认交互工作站
HDESK hDeskOriignInput = OpenInputDesktop(0, FALSE, GENERIC_ALL);		//程序运行起来,获取系统为该线程设置的默认活动桌面

void OnHotKey(WPARAM wParam, LPARAM lParam)
{
	static LRESULT lRes = 0;

	if (wParam == m_HotKeyId1)//热键1被按下
	{
		// 该热键按下时的处理
		SwitchDesktop(hDeskOriignInput);	//原活动桌面被显现出来
		//MessageBox(0,TEXT("F6"),0,0);
	}
	else if (wParam == m_HotKeyId2)//热键2被按下
	{
		SwitchDesktop(hDDesk);				//我们创建的桌面显现出来
		//MessageBox(0,TEXT("F7"),0,0);
	}
	else if (wParam == m_HotKeyId3)//热键2被按下
	{
		MessageBox(0, TEXT("程序退出"), 0, 0);
		PostQuitMessage(0);			//我们创建的桌面显现出来
		//MessageBox(0,TEXT("F7"),0,0);
	}
	return;
}

LRESULT		CALLBACK	WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	RECT rect;

	GetClientRect(hwnd, &rect);

	POINT p;
	ClientToScreen(hwnd, &p);

	RECT winrect;
	GetWindowRect(hwnd, &winrect);

	switch (message)
	{
	case WM_HOTKEY:
		OnHotKey(wParam, lParam);
		return 0;
	}
	return DefWindowProc(hwnd, message, wParam, lParam);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLine, int iCmdShow)
{
	int result = 0;
	typedef BOOL(__stdcall* P_IsWow64Process)(HANDLE, BOOL*);
	HMODULE _Kernel32 = GetModuleHandle(L"kernel32.dll");
	if (_Kernel32 == 0)
	{
		return FALSE;
	}
	P_IsWow64Process iswow64process = (P_IsWow64Process)GetProcAddress(_Kernel32, "IsWow64Process");

	HWND hwnd;
	MSG	 msg;
	WNDCLASS	wndclass;

	wndclass.style = CS_HREDRAW | CS_VREDRAW;
	wndclass.lpfnWndProc = WndProc;
	wndclass.cbClsExtra = 0;
	wndclass.cbWndExtra = 0;
	wndclass.hInstance = hInstance;
	wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
	wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
	wndclass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
	wndclass.lpszMenuName = NULL;
	wndclass.lpszClassName = szAppName;

	if (!RegisterClass(&wndclass))
	{
		MessageBox(NULL, TEXT("窗口注册失败!"), NULL, 0);
		return 0;
	}
	hwnd = CreateWindow(
		szAppName, szAppName,
		WS_OVERLAPPEDWINDOW,
		0, 0,
		0, 0,
		NULL, NULL, hInstance, NULL
	);


	//在进程 默认的交互式工作站中创建 桌面,
	hDDesk = CreateDesktop(
		DESTOP_NAME,
		0, 0, 0,
		GENERIC_ALL,
		NULL
	);
	//设置与本线程相联系的桌面为 我们创建的桌面
	result = SetThreadDesktop(hDDesk);

	//填写STARTUPINFO 结构体信息,注意与平常创建进程的不同,这里有了lpDesktop选项的设置,
	STARTUPINFO sti = {
		sizeof(sti)
	};
	sti.lpDesktop = (LPWSTR)DESTOP_NAME;

	PROCESS_INFORMATION pi = { 0 };

	int bwow64 = 0;
	iswow64process(GetCurrentProcess(), &bwow64);
	if (bwow64)
	{
		result = CreateProcess(TEXT("C:\\Windows\\SysWOW64\\explorer.exe"), NULL, NULL, NULL, TRUE, 0, NULL, NULL, &sti, &pi);
	}
	else {
		result = CreateProcess(TEXT("C:\\Windows\\explorer.exe"), NULL, NULL, NULL, TRUE, 0, NULL, NULL, &sti, &pi);
	}

	if (result)
	{
		CloseHandle(pi.hProcess);
	}

	/****************************************************************
				注册3个热键
	******************************************************************/

	//在全局原子表中添加一项字符串得到id一个,这一项跟   CTRL +SHIFT+F6 有关
	m_HotKeyId1 = GlobalAddAtomW(TEXT("HotKey1")) - 0xc000;
	//注册得到的id与 热键CTRL+SHIFT+F6 关联起来
	RegisterHotKey(hwnd, m_HotKeyId1, 0, VK_F6);

	//在全局原子表中添加一项字符串得到id一个,这一项跟   CTRL +SHIFT+F7 有关
	m_HotKeyId2 = GlobalAddAtomW(TEXT("HotKey2")) - 0xc000;
	//注册得到的id与 热键CTRL+SHIFT+F7 关联起来
	RegisterHotKey(hwnd, m_HotKeyId2, 0, VK_F7);

	//在全局原子表中添加一项字符串得到id一个,这一项跟   F7 有关
	m_HotKeyId3 = GlobalAddAtomW(TEXT("HotKey3")) - 0xc000;
	//注册得到的id与 热键F7 关联起来
	RegisterHotKey(hwnd, m_HotKeyId3, MOD_CONTROL | MOD_SHIFT, VK_F8);

	RegisterHotKey(hwnd, m_HotKeyId3, 0, VK_F8);

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

	//窗口消息循环
	while (GetMessage(&msg, NULL, 0, 0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	//F7 热键按下,即退出,顺便清理资源
	UnregisterHotKey(hwnd, m_HotKeyId1);
	GlobalDeleteAtom(m_HotKeyId1);

	UnregisterHotKey(hwnd, m_HotKeyId2);
	GlobalDeleteAtom(m_HotKeyId2);

	UnregisterHotKey(hwnd, m_HotKeyId3);
	GlobalDeleteAtom(m_HotKeyId3);

	CloseHandle(hDDesk);
	return msg.wParam;
}


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值