全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2474
推到 Plurk!
推到 Facebook!

請教有關擷取延伸螢幕的畫面

缺席
fangback
初階會員


發表:4
回覆:47
積分:40
註冊:2002-06-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-11-11 09:40:23 IP:220.133.xxx.xxx 未訂閱
請教各位大大, 小弟的PC上有多螢幕然後想透過程式去擷取延伸螢幕的畫面,用Screen->Monitor[n], 及TMonitor可得到其它螢幕的相關資訊但除了我用GetDC(0)等的API只有第一個螢幕能正常擷取但其它畫面卻無法擷取到。是否有大大有這一方面的經驗能教一下小弟謝謝。
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-11-12 10:18:21 IP:59.115.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-11-12 12:00:44 IP:220.132.xxx.xxx 未訂閱
RedSnow您好, 謝謝您的回覆,之前我曾寫過以抓DESKTOP的畫面再以第一個螢幕的解析來判斷共有幾個螢幕,然後依該螢幕的號碼數計算擷取那一段的畫面。但這樣的方式有幾個問題: 1 如有2個或以上的螢幕數且解析可能又都不一樣時會出錯。如第一個為1027x768第二個為800x600等 2 WINDOWS的多螢幕除了為 [1][2][3][4]的排列方式外,也可以為 [1][2] [3][4] 等排列方式當為第一種方式且解析又是一樣時可正常取出指定的螢幕畫面,但如果為第二種方式時可能就會有錯了。
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-11-12 12:57:48 IP:59.115.xxx.xxx 未訂閱
fangback 您好:    我僅能設定出兩個解析度相同螢幕並列的環境,其它的環境模擬不出來,因此無法進行更進一步的測試,看來我是難以提供更多的參考資訊了,請其他有相同環境與經驗的先進們關注一下本題吧。      7 天天敲鍵盤 v 時時按滑鼠 8
conundrum
尊榮會員


發表:893
回覆:1272
積分:643
註冊:2004-01-06

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-11-12 13:54:24 IP:218.175.xxx.xxx 未訂閱
參考看看 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=65970 台灣災難都是事後算帳 無人飛行載具(Unmanned Aerial Vehicle,UAV)為什麼沒大量應用於救災行列 絲絲有2種 .net有很多種 一種治眼睛是MS 另一種治腦筋是Borland
fangback
初階會員


發表:4
回覆:47
積分:40
註冊:2002-06-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-11-12 14:10:02 IP:220.132.xxx.xxx 未訂閱
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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-11-12 14:50:24 IP:218.175.xxx.xxx 未訂閱
那就再試試照個了 哈哈 【Delphi】【轉貼】Virtual Desktop -source codes http://delphi.ktop.com.tw/topic.php?TOPIC_ID=81227 台灣災難都是事後算帳 無人飛行載具(Unmanned Aerial Vehicle,UAV)為什麼沒大量應用於救災行列 絲絲有2種 .net有很多種 一種治眼睛是MS 另一種治腦筋是Borland
fangback
初階會員


發表:4
回覆:47
積分:40
註冊:2002-06-15

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-11-12 18:33:07 IP:220.132.xxx.xxx 未訂閱
conundrum您好, 謝謝您的回覆,安裝試了一下雖然和我要寫的有些出入,我來研究一下這一個source code應該可找出相關的API到時再和大家分享。 RedSnow版主,不好意思分數只能給一個我給了conundrum,謝謝您的經驗分享。
系統時間:2024-05-11 19:11:00
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!