2010-10-19 13 views
6

tôi đang viết một ứng dụng chụp màn hình trong Qt4 với C++. Tôi gặp sự cố khi điều chỉnh trên màn hình kép. Tôi không thể tải hình ảnh với màn hình thứ hai. Tôi đã thử một ứng dụng C# và sẽ lấy tất cả các máy tính để bàn trong một hình ảnh và tôi có thể trích xuất từ ​​đó mỗi hình ảnh màn hình máy tính để bàn. Đây là C# mãChụp nhiều màn hình máy tính để bàn bằng cách sử dụng Qt4

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); 
} 

Mã Qt là nhỏ hơn, cũng có thể tôi đã kiểm tra nếu cửa sổ mẹ đẻ xử lý máy tính để bàn khác với Qt desktop0> winId() nhưng họ đều bình đẳng

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

Tôi không chắc chắn nếu đây là một lỗi trong Qt hoặc là một tính năng, sử dụng cùng một cửa sổ xử lý nó chỉ thử lại máy tính để bàn đầu tiên khi trên thực tế máy tính để bàn nó là relay được tạo từ 2 màn hình. Một ý tưởng là sử dụng các cuộc gọi Windows và lưu hình ảnh trong một tập tin tạm thời và tải một QPixmap từ đó, nhưng đó không phải là đơn giản để tiết kiệm một HBITMAP trong một tập tin trong c + + mà không MFC. Kết luận: bạn nghĩ gì là lỗi trong Qt? bất kỳ ý tưởng làm thế nào để làm việc xung quanh nó (không MFC)

+0

Ngoài ra tôi đã tìm thấy một ví dụ sử dụng GDI http: //www.experts-exchange.com/Microsoft/Development/Q_26484815.html, nhìn vào phía dưới, các con số được mã hóa cứng, vì vậy bạn phải lấy kích thước và sửa đổi mã – simion314

Trả lời

3

Gần đây tôi đã nhận thấy cùng một vấn đề.

Tôi cuối cùng đã quyết định xóa Qt để chụp ảnh màn hình. Một tình huống khác trong ngắt Qt là khi sử dụng chủ đề Aero của Windows Vista hoặc Windows 7. Chủ đề này dường như hiển thị tất cả dữ liệu vào bộ đệm nền, vì vậy tất cả ảnh chụp màn hình được chụp bởi Qt đều có màu đen.

Thay vì sử dụng Qt tôi có thể khuyên bạn sử dụng lớp ScreenShooter như đã mô tả ở http://www.apriorit.com/our-experience/articles/9-sd-articles/193-multi-monitor-screenshot

+0

Thx, điều này có thể giúp tôi tiết kiệm với tất cả các HDC, RECT HBITMAP và phức tạp khác structs – simion314

+0

Nếu ứng dụng của bạn là mã nguồn mở, tôi muốn xem mã, có vẻ như với tôi rằng ứng dụng ảnh chụp màn hình bạn đã liên kết sử dụng MFC atlimage.h – simion314

4

bạn có thể đếm màn hình với QDesktopWidget::screenCount() (Qt 4.6) và sau đó đi qua tất cả các màn hình và làm QPixmap::grabWindow(...)

Giới thiệu "máy tính để bàn gồm từ 2 màn hình ". Tất cả phụ thuộc nếu 2 màn hình là ảo (tất cả các màn hình được coi là một màn hình) hay không.

@Frerich Raabe: nó hoạt động trên Windows 7 khi tôi đang sử dụng mã tương tự để thực hiện lấy màn hình.

+0

: grabWindow (...) sẽ trả lại cho tôi màn hình đầu tiên ngay cả khi tôi sử dụng màn hình thứ hai. Bạn có chắc chắn nó hoạt động trong màn hình kép? – simion314

+0

Gần đây tôi đã triển khai chức năng chụp màn hình, và có nó hoạt động tốt. Những gì verrsion của Qt bạn đang sử dụng? –

+0

Tôi đang sử dụng 4.6.3 trên Windows XP sp3, tôi đã thiết lập một màn hình kép và tôi luôn chỉ nhận được màn hình đầu tiên và tôi đã thử tất cả các khả năng, tôi không muốn sử dụng win APIDS – simion314

2

Với máy tính để bàn ảo, phương pháp QPixmap::grabWindow dường như trả lại ảnh chụp màn hình với kích thước của màn hình chính. Việc vượt qua kích thước của màn hình ảo đầy đủ sẽ trả lại ảnh chụp màn hình của cả hai màn hình;

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

Tuy nhiên, để kiểm tra hành vi này vào một hộp Unix/Mac, nhưng nó hoạt động trong môi trường Windows 7.

+0

Làm việc như sự quyến rũ trên Ubuntu 10,10 của tôi! Cảm ơn rất nhiều vì đã cho tôi thấy con đường. – zeFree

0

Trong một thiết lập đa màn hình trên Windows, màn hình thường được gia nhập vào một máy tính để bàn ảo. Tôi nói "thường" bởi vì tôi không hoàn toàn chắc chắn những gì xảy ra trên tất cả các phiên bản Windows từ XP SP0 (25 tháng 10 năm 2001) cho Win8 SP0 (ngày 26 tháng 10 năm 2012). Tuy nhiên, như một máy tính để bàn ảo, điều đó có nghĩa là screen(x) sẽ luôn trả về cùng một tiện ích; từ những gì tôi đã thấy đây là một và chỉ QDesktopWidget chính nó. Tuy nhiên, screenGeometry(x) sẽ trả về các giá trị khác nhau cho mỗi màn hình được liệt kê.

Bạn có thể lấy màn hình thứ hai bằng cách sử dụng kết quả của screenGeometry(x) làm tham số cho QPixmap :: grabWindow; tức là:

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()); 

Điều này đang làm việc cho tôi ngay bây giờ và tôi chuẩn bị xây dựng nhóm QA của mình.