2016-03-08 15 views
7

Tôi có hai màn hình (HP EliteDisplay E190i), cả hai đều được kết nối với hai máy tính (2x VGA + DP).
Những màn hình cũng hỗ trợ DVI, vì vậy thay vì có một nút bật tắt ngu ngốc, mỗi khi tôi muốn thay đổi giữa các máy tính tôi phải điều hướng thông qua trình đơn màn hình. Tôi sử dụng để có màn hình dumber và chuyển đổi đã thực sự dễ dàng, nhưng tôi chỉ không thể làm quen với toàn bộ điều hướng - nó thường bị khó hiểu ...Làm thế nào tôi có thể buộc màn hình vào chế độ tiết kiệm điện ngay lập tức trong C#?

Vì vậy, đây là thỏa thuận - Tôi muốn có thể nhanh chóng chuyển đổi giữa các máy tính bằng cách thực hiện một lệnh. Rõ ràng điều này không thể được thực hiện trực tiếp (các máy tính không được kết nối với nhau bằng mọi cách), nhưng khi màn hình vào chế độ tiết kiệm điện năng (hoặc khi hệ điều hành biến chúng tắt), các màn hình bắt đầu quét đầu vào có sẵn. Bằng cách này, họ sẽ khóa vào máy tính khác và giải quyết vấn đề.

giới thiệu Đủ Mặc dù vậy, tôi đã cố gắng this solution và nó làm việc tuyệt vời, nhưng nó không phải là hoàn hảo:

  • Nó có một phai ra hình ảnh động mà mất một vài giây trước khi màn hình thực sự tắt
  • tôi phải không chạm vào chuột/bàn phím trong suốt thời gian phai trên ra hình ảnh động, nếu không nó sẽ bị hủy

tôi đã cố gắng vô hiệu hóa các đầu vào theo this answer trước khi gửi màn hình ngủ, sau đó bật lại nó sau 5 giây, nhưng điều đó cũng không làm việc vì:

  • Nó đòi hỏi tôi phải chạy ứng dụng với quyền admin, nếu đầu vào sẽ không bị chặn
  • Mặc dù đầu vào đã bị chặn khi chạy với quyền quản trị, tôi vẫn có thể di chuyển chuột hoặc nhấn một số phím trên bàn phím trong khi làm mờ hình động để hủy (ngay cả khi con trỏ không di chuyển hoặc đầu vào bàn phím bị bỏ qua).

Dưới đây là mã của tôi:

[DllImport("user32.dll")] 
private static extern int SendMessage(int hWnd, int hMsg, int wParam, int lParam); 

[DllImport("user32.dll")] 
private static extern int BlockInput(int fBlockIt); 

static void Main() 
{ 
    SendMessage(0xFFFF, 0x112, 0xF170, 2); 
    try 
    { 
     int result = BlockInput(1); 
     Console.WriteLine(result); 
     Thread.Sleep(5000); 
    } 
    finally 
    { 
     BlockInput(0); 
    } 
} 

tôi sử dụng Windows 7 Enterprise x64 trên cả hai máy tính.

Có cách nào để có được lễ toàn này để làm việc?

+0

Vì vậy, các vấn đề với các giải pháp thứ hai là bạn không thể chạy nó với quyền admin? –

+0

Không, đầu vào bị chặn khi tôi chạy nó với quyền quản trị, như mong đợi. Tuy nhiên, mặc dù đầu vào bị chặn, di chuyển chuột hoặc nhấn một phím trên bàn phím của tôi (vật lý) đã hủy hoạt ảnh mờ dần - mặc dù _pointer_ không di chuyển và đầu vào bàn phím bị bỏ qua (phím được nhấn, nhưng không có văn bản nào gõ vào notepad). –

+0

cách chặn đầu vào trước khi gửi lệnh ngủ – RomCoo

Trả lời

0

tôi đã phải chỉnh sửa câu trả lời của tôi, vì ngớ ngẩn Tôi đã không đọc câu hỏi của bạn trong đó là toàn bộ.

tôi sẽ khuyên bạn nên tạo một ứng dụng mà ngồi trên cả hai máy tính mà gửi yêu cầu với nhau thông qua một ổ cắm máy chủ/khách hàng đơn giản TCP.

Điều này sẽ cho phép bạn, ví dụ, nhấn một nút trên PC 1 để đặt chế độ ngủ và làm tương tự cho màn hình và gửi tin nhắn đến PC 2 để đánh thức và lấy cắp đầu vào màn hình. Về tốc độ của điều này, tôi đoán rằng phụ thuộc vào một số biến, nhưng điều này có thể được làm việc trên một thời gian sau đó.

TCP Client/Server:

using System; 
using System.Net; 
using System.Net.Sockets; 
using System.Diagnostics; 
using System.IO; 

namespace ClientSocket_System 
    { 
    class tcpClientSocket 
    { 

    #region Global Variables 

    TcpClient tcpService; 
    IPEndPoint serverEndPoint; 
    NetworkStream netStream; 

    #endregion 


    public void commToServer() 
    { 
     tcpService = new TcpClient(); 
     serverEndPoint = new IPEndPoint(IPAddress.Parse("xxx.xxx.xxx.xx"), xxxx); //Enter IP address of computer here along with a port number if needed 
     try 
     { 
      tcpService.Connect(serverEndPoint); 
      netStream = tcpService.GetStream(); 
      ASCIIEncoding encoder = new ASCIIEncoding(); 
      byte[] buffer = encoder.GetBytes("SwitchComputers"); 
      netStream.Write(buffer, 0, buffer.Length); 
      netStream.Flush(); 
      tcpService.Close(); 
     } 
     catch(Exception ex) 
     { 
     } 
    } 
    } 
} 

Và Server:

using System.Net; 
using System.Net.Sockets; 
using System.Diagnostics; 
using System.IO; 

namespace ClientSocket_System 
{ 
    class tcpServerTerminal 
    { 



     private TcpListener tcpListener; 
     private Thread listenThread; 
     private TcpClient tcpService; 
     string msgFromClient; 



     public void ServerStart() 
     { 
      tcpListener = new TcpListener(IPAddress.Any, 5565); 
      listenThread = new Thread(new ThreadStart(ListenForClients)); 
      listenThread.Start(); 
     } 

     public void ListenForClients() 
     { 
      tcpListener.Start(); 

      while (true) 
      { 
       //blocks until a client has connected to the server 
       TcpClient client = this.tcpListener.AcceptTcpClient(); 

       //create a thread to handle communication 
       //with connected client 
       Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm)); 
       clientThread.Start(client); 
      } 
     } 

     public void HandleClientComm(object client) 
     { 
      tcpService = (TcpClient)client; 

      NetworkStream netStream = tcpService.GetStream(); 

      byte[] message = new byte[4096]; 
      int bytesRead; 

      while (true) 
      { 
       bytesRead = 0; 

       try 
       { 
        //blocks until a client sends a message 
        bytesRead = netStream.Read(message, 0, 4096); 
       } 
       catch 
       { 
        //a socket error has occured 
        break; 
       } 

       if (bytesRead == 0) 
       { 
        //the client has disconnected from the server 
        break; 
       } 

       //message has successfully been received 
       ASCIIEncoding encoder = new ASCIIEncoding(); 

       msgFromClient = encoder.GetString(message, 0, bytesRead); 

       if (msgFromClient == "SwitchComputers") 
       { 

        //RUN CODE HERE TO ACTION PC SLEEP AND MONITOR SLEEP 

        msgFromClient = null; 
       } 
      } 
     } 

     public void SocketSend() 
     { 
      NetworkStream streamToClient = tcpService.GetStream(); 
      ASCIIEncoding encoder = new ASCIIEncoding(); 
      byte[] buffer = encoder.GetBytes("SwitchComputers"); 

      streamToClient.Write(buffer, 0, buffer.Length); 
      streamToClient.Flush(); 
     } 

    } 
} 

Something như thế có lẽ, giá trị xem xét ít nhất, các mã trên là không chính xác nhưng nó tinh chế sẽ cho phép bạn kiểm soát các hành động của cả hai máy tính thông qua mạng gia đình của bạn cho phép các lệnh cụ thể được thực hiện đồng thời: Sleep/Wake, v.v.

Hy vọng điều này sẽ mang lại cho bạn một hướng để điều tra.

Ngoài ra tôi tin rằng nó là thực hành tốt nhất cho mã của bạn để chặn đầu vào phải được định dạng như vậy:

[return: MarshalAs(UnmanagedType.Bool)] 
[DllImport("user32.dll", CharSet=CharSet.Auto, ExactSpelling=true)] 
public static extern bool BlockInput([In, MarshalAs(UnmanagedType.Bool)] bool fBlockIt); 
+0

Điều này sẽ không thực hiện. Các máy tính không được kết nối với nhau theo bất kỳ cách nào (cũng được đề cập trong câu hỏi của tôi). Bên cạnh đó, tôi chủ yếu gặp sự cố với phần 'RUN CODE HERE TO ACTION PC SLEEP AND MONITOR SLEEP', chứ không phải sự giao tiếp giữa các máy tính. –

+0

Xin lỗi tôi đã giả định rằng cả hai sẽ ít nhất được kết nối với một bộ định tuyến hoặc modem bên trong ngôi nhà. Lý do tôi đề nghị chủ yếu là vì khi một máy tính đang ngủ và một người khác thức dậy nó sẽ tự động đẩy dữ liệu đến các chân trực quan, đó là thứ đánh cắp màn hình, vì vậy nó sẽ là một cách thú vị để giải quyết vấn đề của bạn. Tuy nhiên, khi tôi trở về nhà, tôi sẽ gửi một số mã mà tôi sử dụng để dừng tín hiệu hình ảnh từ máy tính đến màn hình và chúng tôi có thể xem nó hoạt động tốt hơn giải pháp hiện tại của bạn hay không. – Digitalsa1nt

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