2016-03-08 1 views
7

私は2台のモニター(HP EliteDisplay E190i)を持っていて、どちらも2台のコンピューター(2x VGA + DP)に接続されています。
これらのモニタもDVIをサポートしているので、愚かなトグルボタンを使用する代わりに、コンピュータ間で変更するたびにモニタのメニューをナビゲートする必要があります。私はダンベルのモニターを持っていたのですが、切り替えは本当に簡単でしたが、ナビゲーション全体に慣れることはできません - たびたび混乱します...C#でモニタを省電力モードにするにはどうすればいいですか?

ここでは、コマンドを実行してコンピュータ間で明らかに、これは直接行うことはできません(コンピュータは何らかの方法で接続されていません)が、モニタが省電力モードに入ると(またはOSがオフにすると)モニタは利用可能な入力のスキャンを開始します。この方法で、他のコンピュータにロックされ、問題が解決されます。

十分な導入は、しかし、私はthis solutionを試みた、それは素晴らしい仕事、それは完璧ではなかった。

  • それはモニターの前に数秒を要したフェードアウトアニメーションが実際に
  • をオフにしていました
  • 私はそれ以外の場合は、モニターを送信する前に
私は this answerに応じた入力を無効にすることを試みた

をキャンセルになるだろう、うち上記フェードアニメーションの期間中、マウス/キーボードに触れないように持っていましたスリープ状態に、それを再度有効にする5秒後に、しかしのでそれもうまくいきませんでした:それはそうでない入力が

  • いってもブロックされません、管理者権限でアプリケーションを実行するために私を必要と

    • 入力が管理者権限で実行されているときにブロックされていたとしても、フェードアウトアニメーション中にマウスを移動したりキーボードのいくつかのキーを押してキャンセルすることができました(ポインタが動かず、キーボード入力が無視されても)。私は両方のコンピュータ上でWindows 7のEnterprise x64のを使用

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

    は、ここに私のコードです。

    この儀式を働かせる方法はありますか?

  • +0

    だから、第二の溶液での問題は、あなたが管理者権限でそれを実行することができなかったことでしたか? –

    +0

    いいえ、管理者権限で実行したときに入力がブロックされました。しかし、入力がブロックされていても、_pointer_が動かずにキーボード入力が無視されても(キーは押されていてもテキストはありませんでしたが)、マウスを動かすかキーボード上のキーを押して(物理的に)メモ帳に入力します)。 –

    +0

    sleepコマンドを送信する前に入力をブロックする方法 – RomCoo

    答えて

    0

    愚かなことに私はあなたの質問を完全に読まなかったので、私は私の答えを編集しなければならなかった。

    シンプルなTCPサーバー/クライアントソケットを介して要求を相互に送信する両方のコンピュータ上にあるアプリケーションを作成することをお勧めします。

    たとえば、スリープ状態にするPC 1のボタンを押してモニタに同じ操作をさせ、PC 2にメッセージを送信して、モニター入力を起きて盗むことができます。これのスピードに関しては、いくつかの変数に依存していると思いますが、これは後で処理することができます。

    TCPクライアント/サーバ:

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

    とサーバ:せめてに探して価値が、おそらくそのような

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

    何か、上記のコードは正確に洗練されたが、それされていませんホームネットワークを介して両方のコンピュータの動作を制御して、特定のコマンドを同時に実行できるようにします。

    これはあなたに新しい調査する方向。

    また、私はそれのようなフォーマットする入力を遮断するためのあなたのコードのためのベストプラクティスであると考えている:

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

    これはできません。コンピュータは、(私の質問でも言及されている)何らかの方法でお互いに接続されていません。また、私は主に、コンピュータ間の通信ではなく、 '実行中のコンピュータのスリープとモニタのスリープ'の部分の実行に問題があります。 –

    +0

    謝罪私は彼らが少なくとも家の中のルータやモデムに接続されていることを前提にしていました。私がそれを提案した理由は、あるコンピュータがスリープ状態になり、別のコンピュータが目を覚ますと自動的にデータをビジュアルピンにプッシュして表示を盗むことになったためです。しかし、私が家に帰ったら、コンピュータから私のモニターへのビジュアル信号を止めるために使うコードをいくつか提出し、それがあなたの現在のソリューションより優れているかどうかを確認します。 – Digitalsa1nt

    関連する問題