#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;
}
windows虚拟桌面例子
于 2023-03-09 18:56:49 首次发布