請教有關擷取延伸螢幕的畫面 |
缺席
|
fangback
初階會員 發表:4 回覆:47 積分:40 註冊:2002-06-15 發送簡訊給我 |
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
fangback 您好: 基本上您就直接使用單螢幕的方式來擷取多螢幕的畫面資料,應該不需要特別去做什麼設定,我自己寫過一支畫面擷取程式,是在單螢幕的環境中撰寫的,也未使用到 TMonitor,剛才我試著將環境調整雙螢幕顯示,結果前述程式可以直接跨螢幕操作,畫面擷取 (全螢幕、自定區域、指定視窗) 的動作也可以跨螢幕運作,捕捉的內容也都可以正確的跨螢幕擷取下來,程式中捕捉全螢幕的敘述如下:
HDC DesktopDC; Graphics::TBitmap *Bitmap = new Graphics::TBitmap(); FrameForm->Hide(); Delay(300); Cursor Save_Cursor = Screen->Cursor; Screen->Cursor = crNone; DesktopDC = GetDC(0); Bitmap->Handle = CreateCompatibleBitmap(DesktopDC, Screen->Width, Screen->Height); BitBlt(Bitmap->Canvas->Handle, 0, 0, Screen->Width, Screen->Height, DesktopDC, 0, 0, SRCCOPY); DeleteDC(DesktopDC); ImageOriginal->Bitmap->Assign(Bitmap); // ImageOriginal 是 TImage32 元件,但應該不至於會有影響 delete Bitmap; Bitmap = NULL; FrameForm->Show(); Screen->Cursor = Save_Cursor;您可以發現上述程式的寫法也是透過 GetDC(0) 及 Screen->Width、Screen->Height 這些方式與資訊來處理的,並未用到什麼特殊的技巧,您參考看看吧。 7 天天敲鍵盤 v 時時按滑鼠 8 |
fangback
初階會員 發表:4 回覆:47 積分:40 註冊:2002-06-15 發送簡訊給我 |
RedSnow您好,
謝謝您的回覆,之前我曾寫過以抓DESKTOP的畫面再以第一個螢幕的解析來判斷共有幾個螢幕,然後依該螢幕的號碼數計算擷取那一段的畫面。但這樣的方式有幾個問題:
1 如有2個或以上的螢幕數且解析可能又都不一樣時會出錯。如第一個為1027x768第二個為800x600等
2 WINDOWS的多螢幕除了為
[1][2][3][4]的排列方式外,也可以為
[1][2]
[3][4] 等排列方式當為第一種方式且解析又是一樣時可正常取出指定的螢幕畫面,但如果為第二種方式時可能就會有錯了。
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
|
conundrum
尊榮會員 發表:893 回覆:1272 積分:643 註冊:2004-01-06 發送簡訊給我 |
|
fangback
初階會員 發表:4 回覆:47 積分:40 註冊:2002-06-15 發送簡訊給我 |
RedSnow版主及conundrum 您們好,
謝謝版主及大大的回覆。有關conundrum提到的那一篇我有爬過了,就是依那篇的方式才會想用Screen->Monitor,TMonitor等方式來取得所有Monitor的Top, Left, Width, Heigth等資訊的。
在TMonitor中有提供每一Monitor的Handle原本以為以該Handle可得取該螢幕的畫面但run起來不是為空白就是會有EXCEPTION的錯誤。還在想當中是否還有其它的方式可正常擷取指定的延伸螢幕畫面。 以下是部份的程式碼
int MonIndex; // 目前的指定螢幕 TCanvas *cs=new TCanvas; HDC dc; d=Screen->Monitors[MonIndex]->Handle; dc=GetDC(d); // <--- 如果這樣下會出錯 cs->Handle=dc; // 但如果將這一行改為cd->Handle =Screen->Monitors[MonIndex]->Handle; 沒有畫面出現 bmp1->Width=Screen->Monitors[MonIndex]->Width; bmp1->Height=Screen->Monitors[MonIndex]->Height; bmp1->Canvas->CopyRect(Rect(0, 0, bmp1->Width, bmp1->Height), cs, Rect(Screen->Monitors[MonIndex]->Left, Screen->Monitors[MonIndex]->Top, Screen->Monitors[MonIndex]->Width, Screen->Monitors[MonIndex]->Height)); Image1->Picture->Bitmap->Assign(bmp1); |
conundrum
尊榮會員 發表:893 回覆:1272 積分:643 註冊:2004-01-06 發送簡訊給我 |
|
fangback
初階會員 發表:4 回覆:47 積分:40 註冊:2002-06-15 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |