Windows虚拟桌面
生活随笔
收集整理的這篇文章主要介紹了
Windows虚拟桌面
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
PROCESS_INFORMATION ProcessInfo;
STARTUPINFO StartupInfo;
HDESK hDesktop;
HDESK hOriginalThread;
HDESK hOriginalInput;//核心代碼://創建名稱為“Virtual”的虛擬桌面
hDesktop = CreateDesktop("Virtual", NULL, NULL, 0, GENERIC_ALL , NULL);//初始化創建進程必須的結構體
ZeroMemory(&StartupInfo, sizeof(StartupInfo));
ZeroMemory(&ProcessInfo, sizeof(ProcessInfo));
StartupInfo.cb = sizeof(StartupInfo);
StartupInfo.lpDesktop = "Virtual";//記錄原始桌面的句柄
hOriginalThread = GetThreadDesktop(GetCurrentThreadId());
hOriginalInput = OpenInputDesktop(0, FALSE, DESKTOP_SWITCHDESKTOP);//創建桌面外殼進程
CreateProcess(NULL, "explorer", NULL, NULL, FALSE, 0, NULL, NULL, &StartupInfo, &ProcessInfo);//下面是桌面切換代碼:
SetThreadDesktop(hDesktop); //設置桌面活動焦點是虛擬桌面
SwitchDesktop(hDesktop); //切換到虛擬桌面
SetThreadDesktop(hOriginalThread);
SwitchDesktop(hOriginalInput);
CloseDesktop(hDesktop); //關閉虛擬桌面//核心代碼就是這些,然后加入熱鍵,設置程序切換時的特效什么的就自由添加好了
附上程序源代碼://stdafx.h//由于用到漸顯漸隱的效果,需要加入AnimateWindow,由于VC6的限制,要在最上面加入#undef WINVER
#define WINVER 0X500//VitualDesktopDlg.hpublic:PROCESS_INFORMATION ProcessInfo;STARTUPINFO StartupInfo;HDESK hDesktop;HDESK hOriginalThread;HDESK hOriginalInput;BOOL IsOriginalDesktopActive; //是否在原始桌面rzBOOL IsInitialDesktop; //是否初始化桌面,防止灰色按鈕克星造成不可估計的后果BOOL IsWindowShow; //程序是否可見protected:afx_msg LRESULT OnHotKey(WPARAM wParam, LPARAM lParam);//自定義熱鍵消息//VitualDesktopDlg.cpp
#include <WINUSER.H>
#pragma comment(lib, "user32.lib") //這兩個是AnimateWindow要的頭和庫BEGIN_MESSAGE_MAP(CVitualDesktopDlg, CDialog)
//{{AFX_MSG_MAP(CVitualDesktopDlg)ON_MESSAGE(WM_HOTKEY, OnHotKey) //鏈接熱鍵消息
//}}AFX_MSG_MAP
END_MESSAGE_MAP()BOOL CVitualDesktopDlg::OnInitDialog()
{CDialog::OnInitDialog();ModifyStyleEx(WS_EX_APPWINDOW, WS_EX_TOOLWINDOW); //設置窗體樣式為工具樣式,這樣任務欄就沒有圖標了
SetIcon(m_hIcon, TRUE); // Set big iconSetIcon(m_hIcon, FALSE); // Set small icon
IsOriginalDesktopActive = FALSE;IsInitialDesktop = TRUE;IsWindowShow = TRUE;RegisterHotKey(m_hWnd, 521, MOD_WIN, 'X'); //設置顯示程序熱鍵為 Win+Xreturn TRUE; // return TRUE unless you set the focus to a control
}void CVitualDesktopDlg::OnOK()
{if (IsInitialDesktop) //第一次運行時初始化程序,加上判斷防止灰色按鈕克星
{//創建名稱為“Virtual”的虛擬桌面hDesktop = CreateDesktop("Virtual", NULL, NULL, 0, GENERIC_ALL , NULL);//初始化創建進程必須的結構體ZeroMemory(&StartupInfo, sizeof(StartupInfo));ZeroMemory(&ProcessInfo, sizeof(ProcessInfo));StartupInfo.cb = sizeof(StartupInfo);StartupInfo.lpDesktop = "Virtual";//記錄原始桌面的句柄hOriginalThread = GetThreadDesktop(GetCurrentThreadId()); hOriginalInput = OpenInputDesktop(0, FALSE, DESKTOP_SWITCHDESKTOP);//創建桌面外殼進程CreateProcess(NULL, "explorer", NULL, NULL, FALSE, 0, NULL, NULL, &StartupInfo, &ProcessInfo);//完成初始化,以后不會再次被調用,防止打開虛擬桌面出現資源管理器IsInitialDesktop = !IsInitialDesktop;SetThreadDesktop(hDesktop); //設置桌面活動焦點是虛擬桌面SwitchDesktop(hDesktop); //切換到虛擬桌面
GetDlgItem(IDOK)->EnableWindow(FALSE); //設置初始化按鈕失效,只允許熱鍵操作RegisterHotKey(m_hWnd, 1314, MOD_ALT, 'Z'); //設置熱鍵為 Alt+Z
}return;CDialog::OnOK();
}void CVitualDesktopDlg::OnClose()
{//注銷熱鍵UnregisterHotKey(m_hWnd, 1314);UnregisterHotKey(m_hWnd, 521);//關閉創建的explorerif (!IsInitialDesktop){HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessInfo.dwProcessId); //獲取虛擬桌面的explorer句柄if(hProcess) {TerminateProcess(hProcess, 1); //結束虛擬桌面的explorer
}CloseHandle(hProcess);}exit(0);CDialog::OnClose();
}LRESULT CVitualDesktopDlg::OnHotKey(WPARAM wParam, LPARAM lParam)
{if (wParam == 1314) //消息為 Alt+Z 時
{if (IsOriginalDesktopActive) //是否在原始桌面
{hDesktop = CreateDesktop("Virtual", NULL, NULL, 0, GENERIC_ALL , NULL); //創建虛擬桌面(與CloseDesktop相對應)
SetThreadDesktop(hDesktop);SwitchDesktop(hDesktop);} else{SetThreadDesktop(hOriginalThread);SwitchDesktop(hOriginalInput);CloseDesktop(hDesktop); //關閉虛擬桌面
}IsOriginalDesktopActive = !IsOriginalDesktopActive;}if (wParam == 521){if (IsWindowShow){AnimateWindow(m_hWnd, 521, AW_BLEND|AW_HIDE); //隱藏窗口
}else{AnimateWindow(m_hWnd, 521, AW_BLEND); //顯示窗口
}IsWindowShow = !IsWindowShow;}return TRUE;
}
?
轉載于:https://www.cnblogs.com/2018shawn/p/9836620.html
總結
以上是生活随笔為你收集整理的Windows虚拟桌面的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ubuntu下安装JRE7
- 下一篇: Android编码规范