2016-03-08 23 views
7

我有两台显示器(HP EliteDisplay E190i),都连接到两台计算机(2x VGA + DP)。
这些显示器还支持DVI,因此不必每次都有一个愚蠢的切换按钮,每当我希望在计算机之间切换时,我必须浏览显示器的菜单。我曾经有笨显示器和开关是很容易的,但我不能习惯的整个导航的东西 - 它往往变得扑朔迷离......如何在C#中立即强制显示器进入省电模式?

所以这里的交易 - 我希望能够快速切换通过执行命令在计算机之间。显然这不能直接完成(计算机之间没有任何连接),但是当显示器进入省电模式(或者当操作系统关闭它们时),显示器开始扫描可用输入。这样他们会锁定到另一台计算机,并解决问题。

够介绍,虽然,我已经试过this solution和它的工作很好,但它并不完美:

  • 它有一个淡出动画历时几秒钟之前的显示器实际上关闭
  • 我只好不触摸鼠标/键盘上面的淡出动画的时长,否则会得到发送显示器之前取消

我试图根据this answer禁止输入睡觉,然后重新启用它在5秒后,但也没有工作,因为:

  • 它要求我跑与管理员权限的应用程序,否则输入将不会被阻止
  • 即使输入在使用管理权限运行时被阻止,我仍然可以在淡出动画期间移动鼠标或按下键盘上的某些按键以取消它(即使指针未移动或键盘输入被忽略)。

这里是我的代码:

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

我使用Windows 7 Enterprise 64在两台计算机上。

有没有什么办法让整个仪式工作?

+0

因此,与第二个解决方案的问题是,你不能用管理员权限运行呢? –

+0

不,当我按照预期运行管理员权限时,输入被阻止。然而,即使输入被封锁,移动鼠标或按我的键盘上的键(物理)取消了淡出动画 - 即使_pointer_没有移动和键盘输入被忽略(被按下的键,但没有文字是键入记事本)。 –

+0

如何在发送睡眠命令之前阻止输入 – 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

这是行不通的。电脑之间没有任何连接(我的问题也提到过)。另外,我主要是遇到'RUN CODE HERE TO ACTION PC SLEEP AND MONITOR SLEEP'部分,而不是计算机之间的通信。 –

+0

道歉我做,他们都将至少被连接到住宅内的路由器或调制解调器的假设。我认为这主要是因为当一台计算机是睡着了,另一个醒来,它会自动将数据推送到视觉引脚这就是抢断显示,所以它本来已经解决您的问题,以有趣的方式的原因。不过话虽这么说,当我回到家里,我会提出一些我用它来停止从我的计算机视觉信号,我的显示器的代码,我们可以看到,如果它比当前解决方案更好。 – Digitalsa1nt

相关问题