5


1

C#でディスプレイをスリープモードに送信する

これは、設定された時間が経過するとディスプレイがスリープモードになる標準のWindows機能です。 Windows 7のc#.netアプリケーションからディスプレイをスリープモードにすぐに送信することはどういうわけですか? 見つけたことが1つありましたが、うまくいきませんでした。

[DllImport("user32.dll")]
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);

[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern IntPtr GetDesktopWindow();

private const int SC_MONITORPOWER = 0xF170;
private const UInt32 WM_SYSCOMMAND = 0x0112;
private const int MONITOR_ON = -1;
private const int MONITOR_OFF = 2;
private const int MONITOR_STANBY = 1;

public static void DisplayToSleep()
{
    var hWnd = GetDesktopWindow();
    var ret = SendMessage(hWnd , Constants.WM_SYSCOMMAND, (IntPtr)Constants.SC_MONITORPOWER, (IntPtr)Constants.MONITOR_OFF);
}

hWndには有効な値があるようですが、retは常に0です。

thx、kopi_b

3 Answer


8


これは、WinFormsアプリケーションで正常に機能します。

public partial class Form1 : Form
{
    private int SC_MONITORPOWER = 0xF170;
    private uint WM_SYSCOMMAND = 0x0112;

    [DllImport("user32.dll")]
    static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        SendMessage(this.Handle, WM_SYSCOMMAND, (IntPtr)SC_MONITORPOWER, (IntPtr)2);
    }
}

問題は「GetDesktopWindow」関数に起因するようです。


4


モニターの電源がオフになるようにするには、デスクトップウィンドウハンドルの代わりに `HWND_BROADCAST`を使用する必要があります。

private const int HWND_BROADCAST = 0xFFFF;

var ret = SendMessage((IntPtr)HWND_BROADCAST, WM_SYSCOMMAND, (IntPtr)SC_MONITORPOWER, (IntPtr)MONITOR_OFF);


0


Visual Studio 2010とWindows 7を使用し、「スリープ」ボタンと「休止状態」ボタンを持つWindowsフォームアプリケーションを作成しました。 以下は私のために働いた:

private void Sleep_Click(object sender, EventArgs e)
{
    bool retVal = Application.SetSuspendState(PowerState.Suspend, false, false);

    if (retVal == false)
        MessageBox.Show("Could not suspend the system.");
}

private void Hibernate_Click(object sender, EventArgs e)
{
    bool retVal = Application.SetSuspendState(PowerState.Hibernate, false, false);

    if (retVal == false)
        MessageBox.Show("Could not hybernate the system.");
}

私はこれを見つけましたhttp://codehill.com/2009/01/lock-sleep-or-hibernate-windows-using-c/ [こちら]