2013-02-13 6 views
11

Với .NET (mọi phiên bản) chạy trên Windows XP/Vista/7/8 - có thể đặt trước một màn hình cho ứng dụng toàn màn hình và hiển thị dữ liệu/đồ họa/bất cứ thứ gì trong khi vẫn giữ bất kỳ màn hình nào khác cho Windows Tương tác người dùng giao diện người dùng như máy tính để bàn hoặc các ứng dụng khác?Có thể tiếp quản toàn bộ màn hình của nhiều màn hình với .NET trên Windows không?

Kịch bản sử dụng/quy tắc ở đây như sau:

  1. Các máy tính phải có khả năng chạy tất cả các chương trình như nó vốn có.

  2. Không có sự tương tác nào được yêu cầu đối với nội dung .NET (ví dụ: không nhấn phím, bấm chuột, v.v.).

  3. Không có giao diện người dùng hoặc hộp thoại nào khác từ các ứng dụng khác có thể xâm nhập vào màn hình được xác định trước dành riêng để hiển thị đầu ra từ tệp thực thi .NET.

  4. Màn hình được xác định trước với nội dung .NET phải không có con trỏ chuột hiển thị VÀ các màn hình khác phải có đường viền con trỏ như thể không có thêm màn hình nào (tức là con trỏ phải dừng ở mép của màn hình) hoặc nhiều máy tính để bàn).

  5. Nội dung phải hiển thị ngay cả khi PC bị khóa (tức là người dùng đã đăng nhập nhưng máy trạm bị khóa từ Explorer).

Tôi biết tôi có thể đạt được điều này với một số bộ điều khiển USB bên ngoài điều khiển màn hình thứ cấp hoặc thiết bị hiển thị khác và sau đó xây dựng nội dung/đồ họa theo cách thủ công. với các trình điều khiển WDDM bình thường w/màn hình bình thường?

Sửa: Để làm rõ hơn nữa - Tôi hiểu có nhiều cách tiếp cận để đạt được một kết quả tương tự như nhưng câu hỏi ở đây là người ta có thể thực hiện theo tất cả của thông số kỹ thuật/quy tắc trên.

+0

Bạn có sử dụng WPF hoặc Windows Forms không? – alu

+3

Chỉ cần tạo biểu mẫu trên cùng không có đường viền tối đa với Con trỏ tùy chỉnh trống. –

+0

@alu - có thể sử dụng hoặc cái gì đó khác. Tôi mở cho tất cả các ý tưởng ở đây. – allu

Trả lời

0

Cách tiếp cận được chọn tuân thủ phần nào tất cả các quy tắc thiết kế là ... đợi cho nó .. ảo hóa. Tuy nhiên nó không phù hợp với yêu cầu của việc sử dụng các file thực thi .NET (để hack vào WDDM).

Máy tính ban đầu là máy chủ ảo hóa có hai khách. Một cho ứng dụng .NET và một cho người dùng cuối có các USB thích hợp, vv được gán cho nó. Cách tiếp cận này tự nhiên có rất nhiều cảnh báo:

  • WDDM không được thừa hưởng theo bất kỳ cách nào và có thể xảy ra sự cố về hiệu suất. Đối với ứng dụng văn phòng bình thường, tuy nhiên đây không phải là vấn đề gì cả.
  • Trừ khi sử dụng Hyper-V, phần mềm ảo hóa luôn là bên thứ 3.
  • Hyper-V trong Hyper-V là không thể, vì vậy khách không thể ảo hóa thêm bất kỳ thứ gì (ít nhất là không có tốc độ hợp lý vì nó sẽ chạy mà không có bộ giám sát).
  • Trong một số trường hợp, yêu cầu nhiều giấy phép cho bất kỳ phần mềm nào.
  • Không có IPC hoặc tương tác khác giữa tệp thực thi .NET và các ứng dụng khác giữa hai khách.

Tuy nhiên, giải pháp chính nó hoạt động hoàn hảo - không cách nào người dùng có thể ghi đè hoặc tương tác với những gì đang được hiển thị trên màn hình bổ sung miễn là máy chủ cơ bản được cấp nguồn và không bị lỗi. Khóa máy tính người dùng cuối không ảnh hưởng đến các khách khác và vân vân.

4

Có vẻ như tôi đang thiết kế một ứng dụng .NET sẽ được sử dụng hoàn toàn cho đầu ra (tức là hiển thị biểu đồ/biểu đồ, video, v.v.). Ứng dụng phải có màn hình chuyên dụng và không có ứng dụng nào khác (hoặc thậm chí con trỏ có thể nhập các giới hạn của màn hình).

Cảm giác ruột của tôi là trong khi bạn có thể buộc ứng dụng của bạn vào một màn hình cụ thể (XBMC có chức năng này), tôi nghi ngờ bạn có thể ngăn tất cả các ứng dụng khác của bạn xâm nhập vào vùng hiển thị của màn hình.

Khi tôi đọc câu hỏi, một cái gì đó trong đầu tôi nhấp và tôi nghĩ "có thể bạn muốn một cái gì đó tương tự như ái lực CPU, mà bạn có thể đặt trong cửa sổ, và buộc ứng dụng của bạn chỉ sử dụng lõi cpu cụ thể ... là một cái gì đó tương tự cho màn hình/khu vực hiển thị? "

Chắc chắn, Windows cung cấp các chức năng:

http://msdn.microsoft.com/en-gb/library/windows/desktop/dd375340(v=vs.85).aspx

http://msdn.microsoft.com/en-gb/library/windows/desktop/dd375338(v=vs.85).aspx

Bạn sẽ có thể PInvoke những mà không nhiều rắc rối. Tuy nhiên điều đó sẽ chỉ giải quyết bạn có thể buộc ứng dụng của bạn chỉ có một màn hình cụ thể. Đối với mỗi ứng dụng khác trong hệ thống, tôi nghi ngờ bạn sẽ có thể kiểm soát mối quan hệ hiển thị của họ một cách dễ dàng.Tại một dự đoán thô, bạn sẽ cần phải sử dụng một cuộc gọi API Win32 khác để nhận tham chiếu đến tất cả các tay cầm cửa sổ trong hệ thống, và kiểm tra mối quan hệ hiển thị của chúng, và nếu chúng hiển thị trong màn hình chuyên dụng của bạn, hãy di chuyển chúng sang nơi khác.

này có thể giúp với nhận được tất cả cửa sổ xử lý:

How to get list or enumerate all handles of unmanaged windows with same class and name

http://msdn.microsoft.com/en-us/library/ms633497%28VS.85%29.aspx

Chỉ cần nghĩ rằng tôi sẽ ném này trong đó, nó có thể không hữu ích, nhưng hy vọng rằng sẽ cung cấp cho bạn một số chi tiết phương hướng.

EDIT: Tôi thấy điều này quá ... có thể sử dụng một số

Reserve screen area in Windows 7

+0

Không có cách nào trong số những cách tiếp cận này dường như ngăn chặn sự xâm nhập của chuột vào màn hình _reserved_ hoặc giữ cho ứng dụng hiển thị ngay cả khi PC bị khóa. – allu

+0

@allu - Hans đã đề xuất giải pháp xử lý chuột. Một lần nữa, tôi nghi ngờ bạn có thể buộc chuột không nhập vùng màn hình, nhưng bạn có thể ngăn không cho nó hiển thị trong vùng đó bằng cách thay đổi con trỏ thành vùng trống. Tương tự, tôi nghi ngờ bạn có thể làm cho ứng dụng vẫn hiển thị khi PC bị khóa ... nếu bạn có thể, tôi rất vui khi được nghe như thế nào! – series0ne

4
  1. Các máy tính phải có khả năng chạy tất cả các chương trình như nó vốn có.

  2. Không có sự tương tác nào được yêu cầu đối với nội dung .NET (ví dụ: không nhấn phím, bấm chuột, v.v.).

  3. Không có giao diện người dùng hoặc hộp thoại nào khác từ các ứng dụng khác có thể xâm nhập vào màn hình được xác định trước dành riêng để hiển thị đầu ra từ tệp thực thi .NET.

Một cách để đạt được điều này có thể là để tạo ra một cửa sổ docking (AppBar). Điều đó sẽ có chức năng tương tự như thanh Taskbar hoặc Desktop Docks như Google Desktop, vv

Hai bài báo có thể được giúp đỡ:
CodeProject: AppBar using C#
CodeProject: Creating an application like Google Desktop in WPF and C#

Một cách khác để giải quyết vấn đề # 3 là sử dụng PInvoke (hoặc thậm chí tốt hơn, Managed WinAPI) để quét máy tính của bạn để mở các cửa sổ đều đặn. Nếu một cửa sổ được tìm thấy là 'xâm nhập', bạn chỉ cần móc vào nó và di chuyển nó đi. Không phải là cách tiếp cận tốt nhất nhưng nó vẫn hoạt động.

4. Màn hình được xác định trước với nội dung .NET không được có con trỏ chuột và các màn hình khác phải có đường viền con trỏ như thể không có màn hình phụ nào (tức là con trỏ phải dừng ở cạnh của một hoặc nhiều màn hình).

Đặt thuộc tính con trỏ của biểu mẫu thành con trỏ trống. Điều này có hiệu quả loại bỏ con trỏ chuột.
Dừng con trỏ truy cập vào phần đó của màn hình khá phức tạp. Đặt cược tốt nhất của tôi là sử dụng Global Mouse Hooks để nghe chuyển động của con trỏ và ngăn con trỏ di chuyển vào các khu vực bị chiếm đóng bởi cửa sổ của bạn. Điều đó rõ ràng sẽ làm cho việc thiết lập thuộc tính con trỏ của biểu mẫu vô dụng vì con trỏ chưa bao giờ trên biểu mẫu.

5. Nội dung phải hiển thị ngay cả khi PC bị khóa (tức làngười dùng đã đăng nhập nhưng máy trạm bị khóa từ Explorer)

Tôi không biết cách nào để đạt được điều này ngắn tạo ứng dụng màn hình khóa vì hành vi tiêu chuẩn của Windows là tắt tất cả màn hình ngoại trừ màn hình chính.

Chỉnh sửa
Bạn có thể hiển thị cửa sổ trên màn hình khóa bằng cách sử dụng psexec.exe -x. PSEXEC là một phần của bộ SysInternals, có sẵn để tải xuống từ http://technet.microsoft.com/en-us/sysinternals/bb897553.aspx.

Nếu bạn định di chuyển theo cách này (hiển thị biểu mẫu ở đầu màn hình khóa), bạn sẽ cần một cách để xác định thời điểm phiên người dùng bị khóa, do đó bạn đổi kích thước biểu mẫu và di chuyển nó ra khỏi đường . Nếu không, bạn sẽ phải tìm cách mở khóa phiên từ ứng dụng của mình.

Bạn cũng có thể muốn xem câu hỏi này How to display UI on logon screen in Windows 7 để biết cách triển khai các ứng dụng màn hình khóa khác.

+0

AppBar là một ý tưởng tuyệt vời và tôi sẽ trao cho bạn tiền thưởng cho nó. – allu

1

Dự án WPF tôi đang thực hiện đã đi tuyến đường thêm mọi thứ bên trong "thùng chứa chính" kế thừa từ System.Windows.Window được thiết lập khi khởi chạy dựa trên sở thích của người dùng hoặc là tất cả màn hình có sẵn, cửa sổ hoặc toàn màn hình. Kiểm soát đó sau đó chỉ tự thiết lập dựa trên tùy chọn như sau:

private void SpanAllMonitors() 
    { 
     WindowStyle = WindowStyle.None; 
     ResizeMode = ResizeMode.NoResize; 
     Width = SystemParameters.VirtualScreenWidth; 
     Height = SystemParameters.VirtualScreenHeight; 
     Left = SystemParameters.VirtualScreenLeft; 
     Top = SystemParameters.VirtualScreenTop; 
    } 

    private void SingleScreen() 
    { 
     WindowStyle = WindowStyle.None; 
     ResizeMode = ResizeMode.NoResize; 
     Width = SystemParameters.PrimaryScreenWidth; 
     Height = SystemParameters.PrimaryScreenHeight; 
     // this will take over the 'primary' monitor, additional math 
     // should allow you to place it on a secondary or other monitor 
     Left = 0; 
     Top = 0; 
    } 
+0

ý tưởng tốt đẹp khác, nhưng không ngăn cản sự xâm nhập của chuột, không hiển thị khi máy tính bị khóa và vv. – allu