線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:5683
推到 Plurk!
推到 Facebook!

GetDc中的全螢幕擷取的問題

答題得分者是:aftcast
roviury
一般會員


發表:3
回覆:49
積分:15
註冊:2008-08-28

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-08-28 19:09:06 IP:203.186.xxx.xxx 訂閱
GetDc中的全螢幕擷取的問題
GetDc(0)與GetDc(GetDesktopWindow()) 同樣可以取得螢幕的DC,到底有什麼方別呢???
難道是....一個為螢幕,一個為桌面?? 只是抓不到開始列的差別???

速度上,1000次迴轉總時間 分別是 62 與 109(至125) 時間差不多相差一倍

0好像是HWND_DESKTOP.....同樣是桌面??
編輯記錄
roviury 重新編輯於 2008-08-28 19:38:32, 註解 無‧
roviury 重新編輯於 2008-08-28 19:43:44, 註解 無‧
roviury 重新編輯於 2008-08-28 19:52:44, 註解 無‧
pedro
尊榮會員


發表:152
回覆:1187
積分:892
註冊:2002-06-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-08-28 19:52:41 IP:59.112.xxx.xxx 未訂閱
一跟二基準不完全相同,第二個有去呼叫GetDesktopWindow()的時間

Parameters

hWnd
[in] Handle to the window whose DC is to be retrieved. If this value is NULL, GetDC retrieves the DC for the entire screen.
roviury
一般會員


發表:3
回覆:49
積分:15
註冊:2008-08-28

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-08-28 19:53:51 IP:203.186.xxx.xxx 訂閱
那麼2者在GetDc中有什麼分別呢???
===================引 用 pedro 文 章===================
一跟二基準不完全相同,第二個有去呼叫GetDesktopWindow()的時間

Parameters

hWnd
[in] Handle to the window whose DC is to be retrieved. If this value is NULL, GetDC retrieves the DC for the entire screen.
pedro
尊榮會員


發表:152
回覆:1187
積分:892
註冊:2002-06-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-08-28 20:42:34 IP:59.112.xxx.xxx 未訂閱
好久以前試過,記得好用0及GetDesktopWindow,應該都是一樣
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-09-21 09:20:01 IP:59.115.xxx.xxx 訂閱
我沒去試,但學理上應該不太一樣。

desktop是指桌面,應該是指explorer的windows,而在它上面可能會有許多的程式的windows在其上面。

screen應該沒有上下層的問題,指的是單一的整體畫面,不管整個畫面有幾個windows。
可是用這樣的實驗看看,打開task

------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-09-21 09:25:57 IP:59.115.xxx.xxx 訂閱
我沒去試,但學理上應該不太一樣。

desktop是指桌面,應該是指explorer的windows,而在它上面可能會有許多的程式的windows在其上面。

screen應該沒有上下層的問題,指的是單一的整體畫面,不管整個畫面有幾個windows。

如果用capture的程式概念來看,會不會一個是取到底層的desktop畫面,而另一個是整個monitor的畫面?


------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-09-25 14:19:15 IP:61.218.xxx.xxx 未訂閱
參考陳寬達 Delphi 深度歷險 一書中第五章一頭栽入桌面的世界一開始的說明
底下有該全文下載的網址:
http://delphi.ktop.com.tw/board.php?cid=32&fid=107&tid=84696
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-09-25 16:08:32 IP:59.115.xxx.xxx 訂閱
剛寫了一小小段程式證明了我的看法。我是使用bcb。


[code c#]
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HDC hdc1, hdc2;
HWND h;
hdc1 = ::GetDC(0);
h = GetDesktopWindow();
hdc2 = ::GetDC(h);
::TextOut(hdc1,1000,700,"AAABBB",6);
::TextOut(hdc2,1024,700,"CCCDDD",6);
::MoveToEx(hdc2,800,600,NULL);
::LineTo(hdc2,1000,700);
}

[/code]

證明方式:
1/ 正常情形下run程式,只會看到AAABBB。
2/ 先把程式叫出來,但不要執行。然後打開工作管理員,找到EXPLORER程序,然後結束它。此時去執行剛的程式,會發現所有都畫出來,即hdc2的資源其實是有畫的。
3/ 記得在工作管理員上的「新工作」上再輸入explorer以回復正常畫面。(不要實驗後就回不去了 -_-)

結論:
Desktop是指最底層的地區(有層的概念),而此地區的上層就是explorer的區塊,故當explorer在時,你看不到輸出。
當使用GetDC(0)時,表screen(無層的概念,指整個畫面),此時不管有多少window放在一起,它總是可以畫在"最上面"。
就區塊的大小來說二者是一樣大的。但觀念上還是不同!
就陳寬達的書上的說明來看,它認為0可能是desktop或是parent window,然而在GetDC中指定0時並非如此。僅管多數的情形如陳先生所說的。
就msdn的GetDC的說明來看,它也指出當設定null時是表示SCREEN。SCREEN並不等於DESKTOP。
------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
編輯記錄
aftcast 重新編輯於 2008-09-25 16:09:22, 註解 無‧
aftcast 重新編輯於 2008-09-25 16:12:53, 註解 無‧
系統時間:2024-04-24 18:46:29
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!