• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            S.l.e!ep.¢%

            像打了激速一樣,以四倍的速度運(yùn)轉(zhuǎn),開心的工作
            簡(jiǎn)單、開放、平等的公司文化;尊重個(gè)性、自由與個(gè)人價(jià)值;
            posts - 1098, comments - 335, trackbacks - 0, articles - 1
              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            虛擬桌面技術(shù)的初步探討

            Posted on 2010-01-13 21:38 S.l.e!ep.¢% 閱讀(1520) 評(píng)論(0)  編輯 收藏 引用 所屬分類: VC
            【原創(chuàng)】虛擬桌面技術(shù)的初步探討
            發(fā)送 QQ 消息給 newjueqi newjueqi 當(dāng)前離線 添加 newjueqi 的聲望 反映此帖

            標(biāo) 題: 【原創(chuàng)】虛擬桌面技術(shù)的初步探討
            作 者: newjueqi
            時(shí) 間: 2009-02-21,21:43
            鏈 接: http://bbs.pediy.com/showthread.php?t=82537

            【文章標(biāo)題】:?虛擬桌面技術(shù)的初步探討??
            【文章作者】:??newjueqi??
            【作者郵箱】:?zengjiansheng1@126.com
            【作者QQ號(hào)】:?190678908
            【編寫語言】:VC++6.0
            【操作平臺(tái)】:?XP-SP2
            【作者聲明】:?這幾天研究了虛擬桌面技術(shù),感覺到這是一種非常有意思的技術(shù),這篇就當(dāng)成是學(xué)習(xí)筆記吧!本人只是感興趣,沒有其它目的,失誤之處敬請(qǐng)給位大俠原諒!

            什么是桌面?
            ??????每一個(gè)運(yùn)行著Window?NT?的系統(tǒng)中都有一個(gè)Window?工作站對(duì)象,這個(gè)對(duì)象是安全對(duì)象的第一層,是所有用戶安全對(duì)象的繼承之源,每一個(gè)Window?工作站對(duì)象可以擁有一些桌面對(duì)象,每一個(gè)桌面都擁有一個(gè)窗口鏈。窗口鏈里存放著顯示在所屬桌面的各種窗口。Window?NT?用了兩個(gè)桌面窗口對(duì)象,一個(gè)是用來處理登陸界面、屏蔽、鎖住工作站等,一個(gè)是我們登陸之后進(jìn)來操作的窗口了。?
            ????Window?NT通過"explorer.exe"進(jìn)程來管理這個(gè)桌面對(duì)象。這就是為什么我們?cè)谌蝿?wù)管理器里殺掉"explorer.exe",我們的桌面就會(huì)消失的原因。

            什么是虛擬桌面?
            ?????虛擬桌面是一種可以在電腦原來桌面基礎(chǔ)上再創(chuàng)造一個(gè)新的桌面出來,在新的桌面上可以進(jìn)行日常的操作。

            虛擬桌面的用途?
            (1)??本人覺得這門技術(shù)最重要的用途就是可以把任何有UI界面的軟件變成一個(gè)后臺(tái)軟件(即看不到任何界面,包括啟動(dòng)界面)
            (2)??可以時(shí)工作時(shí)是一個(gè)桌面,娛樂時(shí)是一個(gè)桌面(大家可以去下載網(wǎng)站上搜索一下這類軟件的用途,上面的功能描述非常有意思)

            虛擬桌面的實(shí)現(xiàn)方法
            在windows中,要?jiǎng)?chuàng)建一下新的桌面可用到API:CreateDesktop(),函數(shù)聲明如下
            HDESK?CreateDesktop(
            ??LPCTSTR?lpszDesktop,?????????//?新桌面的名稱
            ??LPCTSTR?lpszDevice,??????????//?為NULL
            ??LPDEVMODE?pDevmode,??????????//?為NULL
            ??DWORD?dwFlags,???????????????//?指定應(yīng)用程序在桌面的兼容方式
            ??ACCESS_MASK?dwDesiredAccess,?//?指定新桌面的權(quán)限
            ??LPSECURITY_ATTRIBUTES?lpsa???//指定句柄是否能被繼承
            );

            返回值是新創(chuàng)建的桌面的句柄。

            那么新建了一個(gè)桌面后,怎么在這個(gè)新的桌面上運(yùn)行程序呢?先不要著急,我們先來回顧一下創(chuàng)建進(jìn)程的函數(shù)CreateProcess(),在這個(gè)函數(shù)的參數(shù)中StartupInfo中有?lpDesktop這么一個(gè)屬性,如果這個(gè)屬性為NULL則在當(dāng)前的桌面創(chuàng)建線程,如果指定了桌面的名稱,則進(jìn)程將會(huì)在指定的桌面上啟動(dòng),所以想在創(chuàng)建的新桌面里初始化一些程序,只要把lpDesktop參數(shù)指定為新桌面的名稱即可。

            另外也有一個(gè)簡(jiǎn)單的方法可把新的線程掛在新創(chuàng)建的桌面下,就是使用API函數(shù)SetThreadDesktop(),聲明如下:
            BOOL?SetThreadDesktop(
            ??HDESK?hDesktop??//?指向指定的桌面句柄
            );

            但使用這個(gè)函數(shù)要注意一點(diǎn),根據(jù)MSDN的說法:The?SetThreadDesktop?function?will?fail?if?the?calling?thread?has?any?windows?or?hooks?on?its?current?desktop?(unless?the?hDesktop?parameter?is?a?handle?to?the?current?desktop)??意思就是除非要指定的桌面句柄是當(dāng)前的桌面,不然的話這個(gè)函數(shù)的調(diào)用會(huì)失敗如果當(dāng)前線程擁有任何的窗口(即UI界面).

            怎么實(shí)現(xiàn)不同桌面之間的切換呢?
            ?????要在不同的桌面之間切換,可用API函數(shù)SwitchDesktop,聲明如下:
            BOOL?SwitchDesktop(
            ??HDESK?hDesktop??//?桌面的句柄
            );

            另外也可通過點(diǎn)擊“切換”按鈕實(shí)現(xiàn)桌面的切換。

            但又引申出一個(gè)新的問題,必須要知道各個(gè)桌面的句柄,獲取桌面的句柄可通過API函數(shù)GetThreadDesktop,函數(shù)的聲明如下:
            HDESK?GetThreadDesktop(
            ??DWORD?dwThreadId???//線程的ID);

            返回值就是指定線程所在的桌面了。
            ????而且我們必須要認(rèn)清的是創(chuàng)建新桌面的線程啟動(dòng)是在舊的桌面上,所以可以用下面的語句輕松獲得當(dāng)前桌面的句柄:
            GetThreadDesktop(GetCurrentThreadId());???
            返回值就是舊的桌面句柄。

            怎么關(guān)閉新創(chuàng)建的桌面?
            ?????這個(gè)問題其實(shí)也不用我們擔(dān)心,微軟已經(jīng)替我們想好了^-^?,?用CloseDesktop函數(shù)可輕松實(shí)現(xiàn)這個(gè)功能,函數(shù)聲明如下:
            ????BOOL?CloseDesktop(
            ??HDESK?hDesktop??//?指定要關(guān)閉的桌面的句柄
            );

            下面貼一段代碼的例子,是在新創(chuàng)建的桌面上運(yùn)行計(jì)算器(calc.exe)實(shí)現(xiàn)計(jì)算器的后臺(tái)運(yùn)行

            #include?<windows.h>

            HINSTANCE?hInst;??//當(dāng)前的實(shí)例句柄
            HWND?hWnd;????????//窗口句柄
            HDESK?hvirtualDesk;????//新創(chuàng)建的虛擬桌面句柄
            PROCESS_INFORMATION?pi;?//計(jì)算器進(jìn)程信息

            //消息循環(huán)
            LRESULT?CALLBACK?WinProc(
            ??????HWND?hwnd,??????//?handle?to?window
            ??????UINT?uMsg,??????//?message?identifier
            ??????WPARAM?wParam,??//?first?message?parameter
            ??????LPARAM?lParam???//?second?message?parameter
            ??????????????)
            {
            ??switch(uMsg)
            ??{
            ??case?WM_CLOSE:
            ??????TerminateProcess(?pi.hProcess,?1?);
            ??????CloseDesktop(?hvirtualDesk?);
            ??????DestroyWindow(hwnd);
            ??????PostQuitMessage(0);
            ??????break;

            ??case?WM_DESTROY:

            ??????CloseDesktop(?hvirtualDesk?);
            ??????PostQuitMessage(0);
            ??????break;

            ??case?WM_HOTKEY:?

            ????if?(?0x0001?==?wParam?)?//為退出桌面熱鍵Alt+Q
            ????{
            ????????????SendMessage(hwnd,WM_CLOSE,0,0);????
            ????}
            ????break;

            ??default:
            ????return?DefWindowProc(hwnd,uMsg,wParam,lParam);
            ??}
            ??return?0;
            }

            //創(chuàng)建虛擬桌面
            void?CrateVirtualDesk()
            {
            ??//把新創(chuàng)建的虛擬桌面句柄存放在hvirtualDesk
            ??hvirtualDesk=CreateDesktop(?"newdesk",
            ????????????????NULL,
            ????????????????NULL,
            ????????????????DF_ALLOWOTHERACCOUNTHOOK,???
            ????????????????GENERIC_ALL,?????
            ????????????????NULL);???

            }


            //在虛擬桌面上運(yùn)行一個(gè)計(jì)算器的實(shí)例
            void?RunCalc()
            {
            ??STARTUPINFO?si;???
            ??
            ??ZeroMemory(?&si,?sizeof(si)?);??
            ??si.cb?=?sizeof(si);???
            ????si.lpDesktop?=?"newdesk";???
            ??
            ??ZeroMemory(?&pi,?sizeof(pi)?);???
            ??
            ??if(?!CreateProcess(?NULL,???????????????????
            ????"calc",???????????????????????????????????????
            ????NULL,???????????????????????
            ????NULL,??????????????????????
            ????FALSE,??????????????????????
            ????0,??????????????????????
            ????NULL,??????????????????????????
            ????NULL,??????????????????????
            ????&si,???????????????????????
            ????&pi?)?)??????
            ??{?????
            ????MessageBox(NULL,"運(yùn)行計(jì)算器失敗","Error",0);?????
            ????ExitProcess(1);?????
            ??}?????

            }

            int?WINAPI?WinMain(
            ????HINSTANCE?hInstance,??????//?handle?to?current?instance
            ????HINSTANCE?hPrevInstance,??//?handle?to?previous?instance
            ????LPSTR?lpCmdLine,??????????//?command?line
            ?????int?nCmdShow??????????????//?show?state
            ???????????)
            {
            ??WNDCLASS?wndcls;
            ??MSG?msg;

            ??hInst=hInstance;
            ??ZeroMemory(?&wndcls,sizeof(wndcls)?);
            ??wndcls.cbClsExtra=0;
            ??wndcls.cbWndExtra=0;
            ??wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
            ??wndcls.hInstance=hInstance;
            ??wndcls.lpfnWndProc=WinProc;
            ??wndcls.lpszClassName="hello";
            ??wndcls.lpszMenuName=NULL;
            ??wndcls.style=CS_HREDRAW?|?CS_VREDRAW;
            ??RegisterClass(&wndcls);
            ??
            ??hWnd=CreateWindow(?"hello","hello",WS_OVERLAPPEDWINDOW,
            ????300,300,100,100,NULL,NULL,hInstance,NULL?);
            ??
            ??//注冊(cè)所需的熱鍵,Alt+Q為退出創(chuàng)建的虛擬桌面
            ??if(?!RegisterHotKey(?hWnd,0x0001,MOD_ALT?,'Q'?)?)?????
            ????{?????
            ????????//處理退出進(jìn)程?????
            ????????return?TRUE;?????
            ????}?????

            ??//創(chuàng)建虛擬桌面
            ??CrateVirtualDesk();
            ??
            ??//在虛擬桌面上運(yùn)行一個(gè)計(jì)算器的實(shí)例
            ??RunCalc();

            ??ShowWindow(?hWnd,SW_SHOWNORMAL?);
            ??UpdateWindow(?hWnd?);
            ??
            ??while(?GetMessage(?&msg,NULL,0,0?)?)
            ??{
            ????TranslateMessage(&msg);
            ????DispatchMessage(&msg);
            ??}

            ??return?msg.wParam;
            }

            程序運(yùn)行后如下圖
            名稱:  1.JPG
查看次數(shù): 941
文件大小:  114.2 KB

            紅框的virtualDesktop.exe就是代碼創(chuàng)建的程序,calc.exe就是計(jì)算器的進(jìn)程,大家可以看一下任務(wù)欄,是沒有計(jì)算器的影蹤的,證明是運(yùn)行在另一個(gè)桌面上,從另一個(gè)角度來看,就是運(yùn)行在后臺(tái)(只要不切換到另一桌面)。

            上傳的附件
            文件類型: rar 虛擬桌面技術(shù)的初步探討.rar (216.7 KB, 293 次下載) [誰下載?]
            久久成人18免费网站| 久久丫精品国产亚洲av| 91精品国产综合久久香蕉| 国产毛片久久久久久国产毛片 | 东京热TOKYO综合久久精品| 久久九九亚洲精品| 无码人妻久久一区二区三区蜜桃| 亚洲精品国产综合久久一线| 久久国产精品99精品国产| 久久996热精品xxxx| 久久人人爽人人人人片av| 久久电影网2021| 久久精品国产亚洲AV影院| 久久综合狠狠综合久久激情 | 亚洲午夜久久久久久噜噜噜| 国产成人AV综合久久| 久久精品中文字幕无码绿巨人| 国产AV影片久久久久久| 久久99国产精品尤物| 伊人热热久久原色播放www| 久久综合狠狠色综合伊人| 7777精品久久久大香线蕉| 久久精品国产一区二区电影| 91精品国产综合久久精品| 性欧美丰满熟妇XXXX性久久久| 99久久成人18免费网站| 久久精品国产精品青草app| 国产69精品久久久久9999APGF| 午夜精品久久久久久久无码| 18岁日韩内射颜射午夜久久成人 | 99久久无色码中文字幕| 一本一道久久综合狠狠老| 日韩人妻无码一区二区三区久久99| 国产99久久九九精品无码| 91久久成人免费| 国产精品欧美亚洲韩国日本久久| 99久久精品国产毛片| 91精品久久久久久无码| 久久久精品久久久久久| 久久精品18| 久久无码AV一区二区三区|