我使用以下代码打开和关闭显示器:
[DllImport("user32.dll")]
static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);
private const int WM_SYSCOMMAND = 0x0112;
private const int SC_MONITORPOWER = 0xF170;
private const int MonitorTurnOn = -1;
private const int MonitorShutoff = 2;
//Turn them off
SendMessage(f.Handle, WM_SYSCOMMAND, (IntPtr)SC_MONITORPOWER, (IntPtr)MonitorShutoff);
//Turn them on
SendMessage(f.Handle, WM_SYSCOMMAND, (IntPtr)SC_MONITORPOWER, (IntPtr)MonitorTurnOn);
Run Code Online (Sandbox Code Playgroud)
这曾经按预期工作,但在安装Windows 8后(我认为这是原因,因为我看到其他人有同样的问题)打开屏幕将无法正常工作.我仍然可以将其关闭,但无论我使用MonitorTurnOn运行SendMessage()多少次,我仍然需要移动鼠标或按键才能重新启动显示器.
有关如何在Windows 8上运行此工作的任何建议?
好的,我知道这个主题有很多帖子.但是,它们都没有为我的问题提供解决方案:我不想只关闭我的显示器,我希望我的代码关闭特定的显示器.大多数人提到的网址http://fci-h.blogspot.com/2007/03/turn-off-your-monitor-via-code-c.html在这里没有用,因为它关闭了所有的显示.
所以,我有我的笔记本电脑屏幕和一个额外的外接显示器.当我正在看电影时,我将显示屏切换到外接显示器,而我的笔记本电脑屏幕变黑了,然而,它仍然在黑暗中发光.我想把它关掉.有人可以帮忙吗?
编辑:有没有办法来实现这一点,这意味着它不必用.Net编写.基本上,我只需要一个能够交替关闭和打开特定显示器的.exe文件.
我有两台显示器(HP EliteDisplay E190i),两台都连接到两台电脑(2x VGA + DP).
这些显示器也支持DVI,因此我不想使用愚蠢的切换按钮,每次我希望在计算机之间切换时,我都需要浏览显示器的菜单.我以前有笨重的显示器和切换真的很容易,但我不能习惯整个导航的东西 - 它经常让人感到困惑......
所以这是交易 - 我希望能够通过执行命令在计算机之间快速切换.显然这不能直接完成(计算机没有以任何方式相互连接),但是当监视器进入省电模式时(或当操作系统关闭它们时),监视器开始扫描可用输入.这样他们就会锁定另一台计算机并解决问题.
虽然足够的介绍,我已经尝试过这个解决方案并且效果很好,但它并不完美:
我尝试在将监视器发送到睡眠状态之前根据此答案禁用输入,然后在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);
}
}
Run Code Online (Sandbox Code Playgroud)
我在两台计算机上都使用Windows 7 Enterprise x64.
有没有办法让整个仪式上班?
是否可以通过编程方式关闭显示器的电源?
在我看到的所有内容中,包括打开/关闭显示器,人们所说的"关闭"实际上是待机模式.
我正在寻找完全断电,因为它与按下电源按钮的功能相同.下面的代码可以使显示器进入待机模式,但这并不是我想要的.
using System;
using System.Runtime.InteropServices;
namespace ScreenSleep
{
class Program
{
private const int HWND_BROADCAST = 0xFFFF;
private static int WM_SYSCOMMAND = 0x0112;
private static int SC_MONITORPOWER = 0xF170;
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern int SendNotifyMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam);
public static void Main(string[] args)
{
SendNotifyMessage((IntPtr)HWND_BROADCAST, WM_SYSCOMMAND, (IntPtr)SC_MONITORPOWER, (IntPtr)2);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我确信我会得到回复,告诉我只要按下电源按钮,如果这就是我想要的,或者待机模式使用的功率几乎没有,请让我解释为什么那些不理想:
我在一家广播公司工作,所以墙上装满了各种任务的监视器,电源按钮很难到达.虽然所有显示器都是在早上使用的第一件事,但使用过的显示器的数量在一天中会逐渐减少.当人员离开办公室时,如果他们是当天使用指定监视器的最后一个人,他们需要将其关闭.然而,由于难以触及按钮和视频墙的布局,我们不希望人们不断回到那里关闭显示器电源并冒险意外拔出任何插头.早上主管每天早上都会在电源按钮上按下电源按钮,为所有电源按钮供电,因此不需要基于软件的解决方案.还有一项公司要求不要让监视器在一夜之间处于待机模式,因此这不是一种选择.