Qt4

2010-10-19 18 views
6

'u kullanarak birden fazla ekran masaüstü görüntüsünü yakalayın Q ++ ile C++ ile bir ekran yakalama uygulaması yazıyorum. Çift ekranlarda ayar yaparken bir sorunum var. İkinci ekran ile bir görüntü alamıyorum. Bir C# uygulamasını denedim ve tüm masaüstlerini tek bir görüntüde yakalayacağım ve oradan her ekran masaüstü görüntüsünü çıkarabileceğim. İşte C# koduQt4

using System; 
using System.Drawing; 
using System.Runtime.InteropServices; 

public class TestGrab 
{ 
    [STAThread] 
    static void Main(string[] args) 
    { 
    IntPtr hDC = WindowsNative.GetDC(WindowsNative.GetDesktopWindow()); 
    IntPtr hBitmap = WindowsNative.GetCurrentObject(hDC, 
    WindowsNative.OBJ_BITMAP); 
    System.Drawing.Bitmap imageDesktop = System.Drawing.Image.FromHbitmap(
    hBitmap); 
    imageDesktop.Save(@"c:\zzzzdesktop.png"); 
    } 
} 

public class WindowsNative 
{ 
    [DllImport("user32.dll")] 
    public static extern IntPtr GetDesktopWindow(); 

    [DllImport("user32.dll")] 
    public static extern IntPtr GetDC(IntPtr ptr); 

    public const int OBJ_BITMAP = 7; 
    [DllImport("gdi32.dll")] 
    public static extern IntPtr GetCurrentObject(IntPtr hdc, uint 
    uiObjectType); 
} 

Qt kodu daha küçük olmasıdır, yerli pencereler masaüstüne işlemek eğer Ayrıca ben test Qt desktop0> winId() ama onları eşit

QPixmap CaptureWinDesktop() 
{ 
    WId desktop=GetDesktopWindow(); 
    WId desktop2=QApplication::desktop()->winId(); 
    if(desktop!=desktop2) 
    { 
     qDebug("sunt fdiferite WId"); 
    } 
    QPixmap entireDesktop= QPixmap::grabWindow(desktop); 
    return entireDesktop; 
} 
farklıdır

Bunun Qt'de bir hata olup olmadığından emin değilim veya aynı pencere tutamacını kullanarak, aslında masaüstünde 2 ekrandan oluşan röle olduğunda, yalnızca ilk masaüstünü yeniden dener. Bir fikir, yerel pencereler aramaları kullanmak ve geçici bir dosyaya görüntü kaydetmek ve orada bir QPixmap yüklemek, ancak bu MFC olmadan C++ bir dosyada bir HBITMAP kaydetmek için basit değildir. Sonuç: Sizce Qt'deki bir hata mı? etrafında herhangi bir fikir (MFC yok)

+0

Ayrıca GDI http: //www.experts-exchange kullanarak bir örnek buldum.com/Microsoft/Development/Q_26484815.html, aşağıya bakın, numaralar kodlanmış, bu yüzden boyutları almak ve – simion314

cevap

3

Son zamanlarda aynı sorunu fark ettim.

Sonunda ekran görüntülerini almak için Qt'yi bırakmaya karar verdim. Windows Vista veya Windows 7 Aero teması kullanırken, bu Qt sonları bir başka durumdur. Bu tema, tüm verileri bir arka plan arabelleğine dönüştürür, böylece Qt tarafından çekilen tüm ekran görüntüleri tamamen siyahtır. Bunun yerine QDesktopWidget::screenCount() (Qt 4.6) ile ekranları saymak ve sonra tüm ekranlar arasında seyahat ve masaüstü oluşan" Hakkında QPixmap::grabWindow(...)

yapabilirsiniz http://www.apriorit.com/our-experience/articles/9-sd-articles/193-multi-monitor-screenshot

+0

Thx kodunu değiştirmek zorundayım, bu beni tüm HDC, RECT HBITMAP ve diğer karmaşık ile kurtarabilir structs – simion314

+0

Eğer uygulamanız açık kaynak kodlu olduğunu görmek istiyorsanız, bana bağlı kullandığınız ekran görüntüsü uygulamasının MFC atlimage.h kullanır – simion314

4

de açıklandığı gibi ScreenShooter sınıfını kullanarak önerebilir Qt kullanarak

2 ekrandan ". Her şey 2 ekranın sanal olup olmadığını (tüm ekranlar tek ekran olarak kabul edilir) ya da değil.

@Frerich Raabe: Windows 7'de ekran kepçesi gerçekleştirmek için benzer kod kullandığım gibi çalışıyor.

+0

: grabWindow (...) kullandığımda bile ilk ekran benim için döner ikinci ekran. İkili monitörde çalıştığından emin misin? – simion314

+0

Kısa bir süre önce ekran yakalama işlevlerini uyguluyordum ve evet iyi çalışıyordu. Hangi Qt'yi kullanıyorsunuz? –

+0

Windows XP sp3 üzerinde 4.6.3 kullanıyorum, ben bir çift monitör kurulum var ve ben her zaman sadece ilk dağınıklığı var ve ben tüm olasılıkları denedim, röle APDS – simion314

2

Sanal bir masaüstünde, QPixmap::grabWindow yöntemi, birincil ekranın boyutuna sahip bir ekran görüntüsü döndürüyor gibi görünüyor. Tam sanal masaüstünün boyutlarına geçmek, her iki monitörün ekran görüntüsünü döndürür;

QDesktopWidget *desktop = QApplication::desktop(); 
    QPixmap screenshot = QPixmap::grabWindow(desktop->winId(), 0, 0, desktop->width(), desktop->height()); 

Yine Unix/Mac kutuyu bu davranışı test etmek için, ancak Windows üzerinde bir çoklu monitör kurulumunda

+0

Ubuntu 10.10 üzerinde çekicilik gibi çalışıyorum! Bana yolu gösterdiğiniz için çok teşekkürler. – zeFree

0

Windows 7 altında çalışan, monitörler genellikle bir sanal masaüstü içine birleştirilir. "Genellikle" diyorum çünkü tüm Windows sürümlerinde XP SP0'dan (25 Ekim 2001) Win8 SP0'e (26 Ekim 2012) kadar olanlardan tam olarak emin değilim. Ancak, sanal bir masaüstü olarak, bu, screen(x)'un her zaman aynı widget'ı döndüreceği anlamına gelir; Bu gördüğümden bir ve tek QDesktopWidget kendisi. Bununla birlikte, screenGeometry(x), numaralandırılan her monitör için farklı değerler döndürecektir.

Sen QPixmap için :: grabWindow parametre olarak screenGeometry(x) sonucunu kullanarak ikinci ekranı yakala; yani:

QDesktopWidget* desktop = QApplication::desktop(); 
WId wid = desktop->winId(); 
QRect geo = desktop->screenGeometry(indexOfTheMonitorYouWant); 
QPixmap cap = QPixmap::grabWindow(wid, geo.left(), geo.top(), geo.width(), geo.height()); 

Bu şu anda benim için çalışıyor ve benim KG ekibine derlemesi el üzereyim.

İlgili konular