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.h

public:
  PROCESS_INFORMATION ProcessInfo;
  STARTUPINFO StartupInfo;
  HDESK hDesktop;
  HDESK hOriginalThread;
  HDESK hOriginalInput;
  BOOL IsOriginalDesktopActive; //是否在原始桌面rz
  BOOL 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 icon
  SetIcon(m_hIcon, FALSE); // Set small icon

  IsOriginalDesktopActive = FALSE;
  IsInitialDesktop = TRUE;
  IsWindowShow = TRUE;
  RegisterHotKey(m_hWnd, 521, MOD_WIN, 'X'); //設置顯示程序熱鍵為 Win+X

  return 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);

  //關閉創建的explorer
  if (!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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM