Click here to Skip to main content
Click here to Skip to main content

Multiple Desktops

, 27 Oct 2007 CPOL
Rate this:
Please Sign up or sign in to vote.
Simple Dialog based Win32 application that provides multiple desktops for windows platform as available in the Linux System

Introduction

This is a simple Win32 Dialog based application that provides multiple desktop support on windows platform as present in the LINUX system. The application provides you the option to create 1 to 3 desktops. Through these different desktops, you can easily separate your applications. This helps a lot when you have some application that you don't want to close by mistake as you can put it on other desktops. The application also shows the last state of each newly created desktop snapshot in the default desktop.

Screen Shot

Following is the screen shot of the window which shows the last state of all the other desktops. You will be able to see this window only when you are in the default desktop(if you are in another desktop, just press WIN + 1 key to switch to the default desktop). Just click on the Tray Icon to see this window. You can go to another desktop by simply clicking on the Image of that desktop.

Screenshot - MultiDesktop.gif

Background

The application uses the CreateDesktop and SwitchDesktop() API to create and switch the desktop. It also uses the StretchBlt API to capture the desktop and to show it.

  • CreateDesktop: It creates a new desktop
  • SwitchDesktop: It makes a desktop visible and activates it. This enables the desktop to receive input from the user
  • StretchBlt: It is used to copy the source rectangle to the destination rectangle by stretching or compressing it

For better understanding of the above APIs, one can refer to MSDN.

Using the Code

There are three different dialog boxes used in this application. The main Dialog box is used to create and switch the desktop.

The following is the code used in Multidesktop:

//Check the registry for previous setting.
//It show the Number of desktops user require
INT NoOfDesk = CheckRegValue(_T("NoOfDesk"));

//Put the Application ICON in system Tray
PutInTaskBar(hWndDlg);

//Add the Applications path in the System Startup
AddToRun(AppPath)

//registers the Hot key
AddHotKey(hWndDlg);
 
//function retrieves a handle to the desktop that receives user input
//i.e. Default Desktop.
hOriginalInput = OpenInputDesktop(0, FALSE, DESKTOP_SWITCHDESKTOP);

// Create new Desktops Depends on Last Setting 
for (int i=0 ; i<NoOfDesk; i++)
{
    hDesktop[i] = CreateDesktop(DeskName[i], NULL, NULL, 0, GENERIC_ALL, NULL);
}

//Will Open Process in new desktop
//user init process is required to start the explorer and 
//initialize the new desktop 
//At First time only
if(FirstTime)
{
   for (int i=0; i<NoOfDesk; i++)
     {
       //Will Start the Init Process in Each Desktop
       OpenProc(_T("userinit.exe"),DeskName[i]); 
     }
   FirstTime = FALSE;
}

Now we have created the new desktops and saved the handle of the default desktop. Following is the code that shows how to switch to the new desktop. I have used two techniques to switch to the new desktop.

  1. Switch desktop through Hot Key

    I have used four hot keys to switch to and from the new desktop:

    1. Win + 1 is used to switch to the default desktop
    2. Win + 2 is used to switch to the first desktop
    3. Win + 3 is used to switch to the second desktop
    4. Win + 4 is used to switch to the third desktop

    The following code shows how I have done this:

    case WM_HOTKEY:
        {
           HDESK hNewDesk;
           //WIN + 1 Pressed Change to Default Desktop
           if (wParam == GlobalAddAtom(L"First_Desk"))
               {
           hNewDesk    =    hOriginalInput;
           DeskNo        =    -1;
           //WIN + 2 || WIN+ 3 || WIN  + 4 Pressed Previously 
           if (OtherKey)    
             {
             flag            =    TRUE;
             OtherKey        =    FALSE;
             }
             else  // WIN + 2 || WIN+ 3 || WIN  + 4 NOT PRESSED PREVIOUSLY
               {
               flag        =    FALSE;
               }
    
           }
           //WIN + 2 Pressed Changed to New Desktop
           if (wParam    ==    GlobalAddAtom(L"Second_Desk"))    
     
           {
            hNewDesk    =    hDesktop[0];
            PrvDeskNo    =    0;
            OtherKey    =    TRUE;
           }
    
        ....   //Same for Win + 3 and Win + 4
        ....
    
          SwitchDesktop( hNewDesk ) //Switch to Desired Desktop.
    
          if ( flag )
            {
              //Capture the Screen of Desktop and Show in dialog Box.
              CaptureScreen(hStaticDesk[PrvDeskNo]); 
            }
       }
  2. Switch the desktop when you click on the desktop screen shot.

    The following code shows how I have done this:

    case WM_COMMAND:
        if (LOWORD(wParam)    ==    IDC_Desk2 ) 
        {
            SwitchDesktop( hDesktop[0] );
            OtherKey        =    TRUE;
            PrvDeskNo        =    0;
            break;
        }
             ...
             ...  //almost same for other Click Events.

Points of Interest

I am working in a software company where our local site has all the songs listed and the software that plays it. But as it opens as a web browser, most of the time, people shut it down by mistake when they are surfing. One of my friends asked me if I could help him, and I came up with the idea of having a software that provides multiple desktops. Rather than downloading it from the Internet, I thought it would be better to develop my own. Then I came across this beautiful and useful application.

History

  • Submitted on 27th October, 2007

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

Share

About the Author

GauranG Shah
Tester / Quality Assurance
India India
His name is Gaurang Shah. He has completed his bachelor in computer science.Has worked as a System programmer. Currently working as QA Analyst in Pune.

Comments and Discussions

 
GeneralMy vote of 2 Pinmembersamidi27-Aug-14 7:11 
BugIE automatic exit Pinmemberocean_sky25-Apr-12 21:38 
GeneralBug getting ModuleFileName PinmemberChris Schucker1-Jun-09 2:42 
QuestionIs there a way to refresh windows on invisible screens? Pinmemberouaebu27-Jan-09 15:53 
GeneralExcelent! Pinmemberrotter5122-Nov-07 5:46 
GeneralGreat work! PinmemberCOM+1-Nov-07 17:01 
GeneralRe: Great work! PinmemberGauranG332-Nov-07 1:47 
GeneralGreat PinmemberNavdeepBhardwaj29-Oct-07 3:18 
GeneralI want screenshots... Pinmvptoxcct28-Oct-07 23:34 
QuestionFailed to register Hot Ket Pinmembermusicinc_2627-Oct-07 11:32 
AnswerRe: Failed to register Hot Ket PinmemberGauranG3328-Oct-07 20:33 
GeneralRe: Failed to register Hot Ket [modified] Pinmembersuperduck29-Oct-07 20:45 
AnswerRe: Failed to register Hot Ket PinmemberJulian Nicholls31-Oct-07 3:56 
GeneralRe: Failed to register Hot Ket PinmemberGauranG3331-Oct-07 20:10 
GeneralHi Pinmemberkevdelkevdel27-Oct-07 7:10 
AnswerRe: Hi Pinmemberhighandhigher28-Oct-07 3:18 
GeneralRe: Hi PinmemberGauranG3329-Oct-07 2:50 
GeneralRe: Hi PinmemberZ-Systems30-Oct-07 13:36 
Generalheh PinmemberIan MacLean27-Oct-07 6:10 
GeneralRe: heh Pinmemberyctsai1-Nov-07 22:56 
GeneralRe: heh PinmemberIan MacLean3-Nov-07 15:06 
GeneralRe: heh Pinmemberwaiba23-Sep-12 0:09 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Terms of Use | Mobile
Web01 | 2.8.1411028.1 | Last Updated 27 Oct 2007
Article Copyright 2007 by GauranG Shah
Everything else Copyright © CodeProject, 1999-2014
Layout: fixed | fluid