2012-05-04 24 views
7

Tình huống: Tôi có phần mềm thực hiện chia sẻ màn hình qua Internet, nơi một người dùng đóng vai trò là người trình bày và những người dùng khác đóng vai trò là người xem/người tham dự.C++ - Cách chụp ảnh màn hình, ngoại trừ một số cửa sổ

Bên cạnh cửa sổ bản trình bày, người trình bày còn có một bộ KHÔNG CHIA SẺ-WINDOWS xuất hiện trên màn hình (thanh nút để bắt đầu chia sẻ/dừng chia sẻ/v.v., cửa sổ Skype, v.v.).

Người trình bày có thể định cấu hình từ việc thiết lập phần mềm chia sẻ màn hình để ẩn các mục không chia sẻ này (tức là chúng sẽ không xuất hiện trong chia sẻ màn hình đang được gửi tới người tham dự, nhưng nội dung cửa sổ phía sau xuất hiện trong ảnh chụp màn hình).

Ảnh chụp màn hình được gửi ở khoảng 10 khung hình mỗi giây hoặc nhanh hơn.

Câu hỏi: làm cách nào tôi có thể chụp theo trình tự màn hình, ngoại trừ các cửa sổ KHÔNG CHIA SẺ?

Ghi chú:

  • Bởi vì giá trị khung hình mỗi giây cao hơn, tôi không thể giảm thiểu/tối đa hóa/bộ alpha cho các cửa sổ, bởi vì sau đó các cửa sổ sẽ nhấp nháy. Ứng dụng này được viết bằng Win32 C++.
  • Tôi sẽ sử dụng cửa sổ nhiều lớp, nhưng vì tính năng Windows 7 Desktop Composition, không thể sử dụng được (và trong Windows 8, bạn không thể sử dụng DwmEnableComposition nữa để tạm thời và lập trình tắt thành phần)
  • Tôi có thể sử dụng cách tiếp cận cửa sổ theo lớp cho Windows XP/2000/7 vv và một cách tiếp cận khác cho Windows 8 (nếu có), mặc dù tôi muốn một quy trình đơn hoạt động trên tất cả các hệ thống
  • Tôi cũng có thể cố gắng "soạn" ảnh chụp màn hình bằng cách chụp ảnh riêng lẻ (của màn hình, cửa sổ cần chụp) và sử dụng chỉ mục z của chúng để tạo hình ảnh cuối cùng, nhưng do giá trị khung hình mỗi giây được yêu cầu, quá trình này sẽ là quá chậm.
+0

Tôi biết cuộc họp của MSFT là một ví dụ tốt, mặc dù không biết cách thực hiện. – zinking

+0

Cảm ơn bạn - có những sản phẩm tương tự làm điều này (JoinMe hoặc GTM), tôi cũng sẽ cố gắng điều tra điều này, nhưng tôi đã hy vọng cho một câu trả lời nhanh hơn. –

+0

Chụp màn hình thường chụp "vùng màn hình phía trên cửa sổ" thay vì nội dung được vẽ của chính cửa sổ. Bạn có thể thử chụp tất cả các cửa sổ cấp cao nhất có thể nhìn thấy và sắp xếp lại chúng. – Deanna

Trả lời

-1

Tôi nghĩ rằng để giới hạn nội dung chụp trong một cửa sổ lớn sẽ đơn giản hơn. nếu không, bạn sẽ cần phải cắt một số cửa sổ từ ảnh chụp màn hình.

+0

Cảm ơn bạn, nhưng vì nó là một ứng dụng chia sẻ màn hình (một lần nữa, s/w như JoinMe và GoToMeeting đã làm điều này), nó không phải là người dùng thân thiện (hoặc kinh doanh khôn ngoan) để buộc người dùng chỉ chọn một cửa sổ :) –

+3

Dù sao, câu hỏi của tôi đã được nhiều hơn về mặt kỹ thuật - không ai biết ** C/C++ hướng dẫn ** Tôi có thể sử dụng để chụp màn hình trong Windows 7 và/hoặc 8, và ** không ** render một số cửa sổ nhìn thấy được? Tôi đang tìm kiếm ** tương đương với cửa sổ lớp ** (xem [MSDN link] sau (http://social.msdn.microsoft.com/Forums/zh/vcgeneral/thread/6f1e9f74-ae6e-4df1-92b8- 72e7a98bf58f) cho một ví dụ về cách sử dụng các cửa sổ nhiều lớp) –

1

Trong cửa sổ, ngay cả màn hình nền được coi là cửa sổ và có HWND riêng. Tuy nhiên, có vẻ như không dễ dàng sao chép "hình nền" một cách dễ dàng.

Vì vậy, về cơ bản tôi thấy hai cách để thực hiện điều đó. 1. Sao chép toàn bộ máy tính để bàn, ví dụ: Bitblt (GetWindowDC (GetDesktopWindow()), ...)

HOẶC

  1. Sử dụng GetWindow và đi qua danh sách cửa sổ theo hướng ngược bắt đầu từ Desktop-Window mà HWND bạn chỉ có thể xác định với GetDesktopWindow(), như thế này:

    // paint on a black DC hwnd=GetDesktopWindow() while (hwnd = GetWindow(hwnd, GW_HWNDPREV)) { // is this window not shared? continue // else bitblt it into our dc }

Hope tôi đã cung cấp một số nguồn cảm hứng :-) Nếu ai đó biết một wa y làm thế nào để sao chép CHỈ máy tính để bàn mà không có cửa sổ con của nó xin vui lòng cho tôi biết.

+0

Tôi đã thử cách đây 4 tháng. Phương pháp này sẽ tạo ra sự cố khi chụp một số phần tử máy tính để bàn như trình đơn bắt đầu và thanh công cụ. Chúng sẽ được in màu đen trên DC và không có sự minh bạch nào được tạo ra. – Vishnu