MFC实现虚拟桌面(桌面切换)
生活随笔
收集整理的這篇文章主要介紹了
MFC实现虚拟桌面(桌面切换)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
博文來源:http://www.cnbolgs.com/ZzzZzz ,轉載請注明出處
一直用桌面切換,總覺得程序退出后創建的explorer無法退出感到很不爽,就想DIY一個,結果網上找的不是VB(我是VB白癡)就是直接VC++API的,看到頭疼不已,代碼又是那么長(不要噴哦,我討厭看團在一起的代碼,這就是為什么我喜歡用MFC而不是Win32 WinApp的原因 囧TZ)。
程序截圖(有圖有真相):
下面開始貼上分析:(源碼后面給出)
//定義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 iconIsOriginalDesktopActive = 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; }
好了,程序就是那么多了,可以自行修改哦,不滿意的點擊右上方的X鍵,滿意的握個抓留個言。
終于看完了,發個源碼地址:
http://d.1tpan.com/tp2058548247
總結
以上是生活随笔為你收集整理的MFC实现虚拟桌面(桌面切换)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 手机型号JSON数据
- 下一篇: IIS6配置和PHP5.6环境安装