C# 通过热键控制显示器开关

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace OpenMonitor
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            HotKey.RegisterHotKey(this.Handle, 100, 0, Keys.F4);
            HotKey.RegisterHotKey(this.Handle,101,0,Keys.F5);
        }

        class HotKey
        {
            // 如果函数执行成功,返回值不为0。
            // 如果函数执行失败,返回值为0。要得到扩展错误信息,调用GetLastError。
            [DllImport("user32.dll  ", SetLastError = true)]
            public static extern bool RegisterHotKey(
                   IntPtr hWnd,                                  // 要定义热键的窗口的句柄
                    int id,                                            // 定义热键ID(不能与其它ID重复)                       
                   KeyModifiers fsModifiers,        // 标识热键是否在按Alt、Ctrl、Shift、Windows等键时才会生效
                   Keys vk                                            // 定义热键的内容
                   );

            [DllImport("user32.dll  ", SetLastError = true)]
            public static extern bool UnregisterHotKey(
                   IntPtr hWnd,                                  // 要取消热键的窗口的句柄
                    int id                                              // 要取消热键的ID
                   );

            // 定义了辅助键的名称(将数字转变为字符以便于记忆,也可去除此枚举而直接使用数值)
            [Flags()]
            public enum KeyModifiers
            {
                None = 0,
                Alt = 1,
                Ctrl = 2,
                Shift = 4,
                WindowsKey = 8
            }
        }

        protected override void WndProc(ref    Message m)
        {
            const int WM_HOTKEY = 0x0312;
            // 按快捷键   
            switch (m.Msg)
            {
                case WM_HOTKEY:
                    switch (m.WParam.ToInt32())
                    {
                        case 100:
                            MonitorHelper.TurnOn();
                            break;
                        case 101:
                            MonitorHelper.TurnOff();
                            break;
                    }
                    break;
            }
            base.WndProc(ref    m);
        }

        class MonitorHelper
        {
            public static void TurnOn()
            {
                SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, -1);
            }

            public static void TurnOff()
            {
                SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, 2);
            }

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

            private static readonly IntPtr HWND_BROADCAST = new IntPtr(0xffff);
            private const uint WM_SYSCOMMAND = 0x0112;
            private const int SC_MONITORPOWER = 0xf170;
        }
    }
}

posted @ 2014-12-25 16:54  fiskeryang  阅读(256)  评论(0编辑  收藏  举报