2009-09-18 44 views
5

Chúng tôi phải chạy một quy trình từ dịch vụ cửa sổ và nhận ảnh chụp màn hình từ đó.Ảnh chụp màn hình quy trình trong Windows Service

Chúng tôi đã thử các cuộc gọi BitBlt và PrintWindow Win32, nhưng cả hai đều cung cấp các bitmap trống (đen).

Nếu chúng tôi chạy mã của chúng tôi từ quy trình người dùng bình thường, nó hoạt động tốt.

Đây có phải là điều gì đó thậm chí có thể không? Hoặc có thể có một phương pháp khác để thử?

Những điều chúng tôi đã cố gắng:

  1. dịch vụ Windows chạy như Local System, chạy quá trình như Local System -> ảnh chụp màn hình bị lỗi
  2. dịch vụ Windows chạy as Administrator, chạy quá trình as Administrator -> ảnh chụp màn hình bị lỗi.
  3. Ứng dụng Windows đang chạy dưới dạng người dùng XYZ, chạy một quy trình dưới dạng XYZ -> ảnh chụp màn hình hoạt động với cả BitBlt hoặc PrintWindow.
  4. Cố gắng kiểm tra "Cho phép dịch vụ để tương tác với máy tính để bàn" từ Local System

Chúng tôi cũng nhận thấy rằng PrintWindow hoạt động tốt hơn đối với trường hợp của chúng tôi, nó hoạt động nếu cửa sổ là đằng sau một cửa sổ khác.

Đối với các yêu cầu khác, cả quy trình cha và con phải nằm trong cùng một người dùng. Chúng tôi không thể thực sự sử dụng mạo danh từ quy trình này đến quy trình khác.

+1

Bạn đã thử cho phép dịch vụ tương tác với máy tính để bàn chưa? –

+0

Ý tưởng hay, nhưng nó cũng không hoạt động. Tôi cũng nghĩ rằng khi tôi chạy nó như là người dùng Administrator, nó tương đương với việc này. Bạn không thể là người dùng và chọn "cho phép dịch vụ tương tác với máy tính để bàn" từ bảng điều khiển quản lý - nó bị tắt. – jonathanpeppers

+0

Tìm kiếm, xem thêm [Chụp màn hình trên phiên máy tính để bàn máy chủ] (http://stackoverflow.com/questions/5200341/capture-screen-on-server-desktop-session/12851218) – Theraot

Trả lời

3

Tôi không nghĩ điều này là có thể.

Chúng tôi phải thay đổi kịch bản mà ứng dụng của chúng tôi không được bắt đầu từ một dịch vụ, nhưng là một chương trình cửa sổ tiêu chuẩn có NotifyIcon ở góc.

Nếu ai đó vẫn tìm thấy câu trả lời thực sự, hãy cho tôi biết.

3

Bạn đã thử chạy dưới dạng Hệ thống cục bộ với "Cho phép dịch vụ tương tác với máy tính để bàn" đã được kiểm tra chưa?

+0

+1 - Đây là một ý tưởng hay nếu nó hoạt động. Đó chắc chắn là giải pháp duy nhất tôi có thể nghĩ về điều đó. – David

+0

Xem nhận xét ở trên. – jonathanpeppers

-1

Nó hoạt động sử dụng Local System với "Cho phép dịch vụ để tương tác với máy tính để bàn"

Bạn có thể đặt nó programatically sử dụng mẫu này mã:

http://www.vbforums.com/showthread.php?t=367177 (đó là vb.net nhưng rất đơn giản)

+0

Tính năng này chỉ hoạt động trên XP. Không phải trên Vista hoặc 7. Và trên XP nó có hai nhược điểm: 1. Nếu bạn kích hoạt tính năng này, bạn có thể gặp sự cố bằng cách tạo các kết nối mạng trong dịch vụ của mình. 2. Nó sẽ chỉ hiển thị trên màn hình của người dùng đầu tiên đăng nhập. Nếu bạn thực hiện chuyển đổi nhanh sang người dùng thứ hai, bạn cũng sẽ không thấy bất kỳ điều gì. – Oliver

+0

Ad.1 Kết nối mạng? Bằng cách tạo ảnh chụp màn hình? Ad.2 Có bạn đã đúng, do Session 0 Isolation nó không hoạt động trong Vista/7 – ufoq

6

Hiện tại tôi không thể tìm thấy các liên kết tương ứng, nhưng vấn đề là, một dịch vụ Windows chạy trong một phiên khác với một ứng dụng người dùng bình thường.

Trong XP, điều này không hoàn toàn đúng. Dưới đây là tất cả các dịch vụ bắt đầu trong Phiên 0 và người dùng đầu tiên đăng nhập vào hệ thống cũng sẽ chạy trong Phiên 0. Vì vậy, trong trường hợp đó, các thủ thuật như Cho phép dịch vụ tương tác với công việc trên máy tính để bàn. Nhưng nếu bạn chuyển đổi nhanh sang người dùng khác, anh ấy sẽ nhận được Phiên 1 và không có cơ hội tương tác trực tiếp với dịch vụ. Điều này cũng đúng nếu bạn kết nối thông qua RDP với một phiên bản máy chủ (như 2003 hoặc 2008). Các thông tin đăng nhập này cũng sẽ bắt đầu trong phiên cao hơn 0.

Cuối cùng nhưng không kém phần quan có một nhược điểm bằng cách sử dụng sự tương tác với máy tính để bàn:
Nếu bạn bật tùy chọn này và dịch vụ của bạn đang chạy dưới tài khoản hệ thống (mặc định), nó sẽ không thể để tạo ra một kết nối mạng nữa không.

Cách chính xác để có GUI tùy chỉnh hoạt động với dịch vụ là tách chúng thành hai quy trình và thực hiện một số loại IPC (giao tiếp liên ngành). Vì vậy, dịch vụ sẽ khởi động khi máy xuất hiện và ứng dụng GUI sẽ được bắt đầu trong phiên người dùng. Trong trường hợp đó GUI có thể tạo một ảnh chụp màn hình, gửi nó đến dịch vụ và dịch vụ có thể thực hiện với nó, bất cứ thứ gì bạn thích.

Các vấn đề liên quan