Browse Source

commit: import project

HOME 4 years ago
parent
commit
dee0ed7080

+ 25 - 0
TurnoffMonitor.sln

@@ -0,0 +1,25 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.29728.190
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TurnoffMonitorOnLock", "TurnoffMonitorOnLock\TurnoffMonitorOnLock.csproj", "{DCCAC287-A269-4AAD-B71D-48DCBD7BC907}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{DCCAC287-A269-4AAD-B71D-48DCBD7BC907}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{DCCAC287-A269-4AAD-B71D-48DCBD7BC907}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{DCCAC287-A269-4AAD-B71D-48DCBD7BC907}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{DCCAC287-A269-4AAD-B71D-48DCBD7BC907}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+	GlobalSection(ExtensibilityGlobals) = postSolution
+		SolutionGuid = {F6746159-A385-44A0-85B1-98082E24797F}
+	EndGlobalSection
+EndGlobal

BIN
TurnoffMonitorOnLock/Icon.ico


+ 195 - 0
TurnoffMonitorOnLock/IconExtract/IconExtractor.cs

@@ -0,0 +1,195 @@
+/*
+ *  IconExtractor/IconUtil for .NET
+ *  Copyright (C) 2014 Tsuda Kageyu. All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions
+ *  are met:
+ *
+ *   1. Redistributions of source code must retain the above copyright
+ *      notice, this list of conditions and the following disclaimer.
+ *   2. Redistributions in binary form must reproduce the above copyright
+ *      notice, this list of conditions and the following disclaimer in the
+ *      documentation and/or other materials provided with the distribution.
+ *
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ *  TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ *  PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
+ *  OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ *  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ *  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.IO;
+using System.Runtime.InteropServices;
+using System.Windows.Forms;
+
+namespace TurnoffMonitorOnLock.IconExtract
+{
+    internal class IconExtractor
+    {
+        ////////////////////////////////////////////////////////////////////////
+        // Constants
+
+        // Flags for LoadLibraryEx().
+
+        private const uint LOAD_LIBRARY_AS_DATAFILE = 0x00000002;
+
+        // Resource types for EnumResourceNames().
+
+        private static readonly IntPtr RtIcon = (IntPtr)3;
+        private static readonly IntPtr RtGroupIcon = (IntPtr)14;
+
+        ////////////////////////////////////////////////////////////////////////
+        // Fields
+
+        private byte[][] _iconData = null;   // Binary data of each icon.
+
+        ////////////////////////////////////////////////////////////////////////
+        // Public properties
+
+        /// <summary>
+        /// Gets the count of the icons in the associated file.
+        /// </summary>
+        public int Count => _iconData.Length;
+
+        /// <summary>
+        /// Initializes a new instance of the IconExtractor class from the specified file name.
+        /// </summary>
+        /// <param name="fileName">The file to extract icons from.</param>
+        public IconExtractor(string fileName) => Initialize(fileName);
+
+        /// <summary>
+        /// Extracts an icon from the file.
+        /// </summary>
+        /// <param name="index">Zero based index of the icon to be extracted.</param>
+        /// <returns>A System.Drawing.Icon object.</returns>
+        /// <remarks>Always returns new copy of the Icon. It should be disposed by the user.</remarks>
+        public Icon GetIcon(int index)
+        {
+            if (index < 0 || Count <= index) throw new ArgumentOutOfRangeException(nameof(index));
+
+            // Create an Icon based on a .ico file in memory.
+
+            using (var ms = new MemoryStream(_iconData[index])) return new Icon(ms);
+        }
+
+        private void Initialize(string fileName)
+        {
+            if (fileName == null) throw new ArgumentNullException(nameof(fileName));
+
+            var hModule = IntPtr.Zero;
+            try
+            {
+                hModule = NativeMethods.LoadLibraryEx(fileName, IntPtr.Zero, LOAD_LIBRARY_AS_DATAFILE);
+                if (hModule == IntPtr.Zero) throw new Win32Exception();
+
+                // Enumerate the icon resource and build .ico files in memory.
+
+                var tmpData = new List<byte[]>();
+
+                bool Callback(IntPtr h, IntPtr t, IntPtr name, IntPtr l)
+                {
+                    // Refer the following URL for the data structures used here:
+                    // http://msdn.microsoft.com/en-us/library/ms997538.aspx
+
+                    // RT_GROUP_ICON resource consists of a GRPICONDIR and GRPICONDIRENTRY's.
+
+                    var dir = GetDataFromResource(hModule, RtGroupIcon, name);
+
+                    // Calculate the size of an entire .icon file.
+
+                    int count = BitConverter.ToUInt16(dir, 4); // GRPICONDIR.idCount
+                    var len = 6 + 16 * count; // sizeof(ICONDIR) + sizeof(ICONDIRENTRY) * count
+                    for (var i = 0; i < count; ++i)
+                        len += BitConverter.ToInt32(dir, 6 + 14 * i + 8); // GRPICONDIRENTRY.dwBytesInRes
+
+                    using (var dst = new BinaryWriter(new MemoryStream(len)))
+                    {
+                        // Copy GRPICONDIR to ICONDIR.
+
+                        dst.Write(dir, 0, 6);
+
+                        var picOffset = 6 + 16 * count; // sizeof(ICONDIR) + sizeof(ICONDIRENTRY) * count
+
+                        for (var i = 0; i < count; ++i)
+                        {
+                            // Load the picture.
+
+                            var id = BitConverter.ToUInt16(dir, 6 + 14 * i + 12); // GRPICONDIRENTRY.nID
+                            var pic = GetDataFromResource(hModule, RtIcon, (IntPtr)id);
+
+                            // Copy GRPICONDIRENTRY to ICONDIRENTRY.
+
+                            dst.Seek(6 + 16 * i, SeekOrigin.Begin);
+
+                            dst.Write(dir, 6 + 14 * i, 8); // First 8bytes are identical.
+                            dst.Write(pic.Length); // ICONDIRENTRY.dwBytesInRes
+                            dst.Write(picOffset); // ICONDIRENTRY.dwImageOffset
+
+                            // Copy a picture.
+
+                            dst.Seek(picOffset, SeekOrigin.Begin);
+                            dst.Write(pic, 0, pic.Length);
+
+                            picOffset += pic.Length;
+                        }
+
+                        tmpData.Add(((MemoryStream)dst.BaseStream).ToArray());
+                    }
+
+                    return true;
+                }
+
+                NativeMethods.EnumResourceNames(hModule, RtGroupIcon, Callback, IntPtr.Zero);
+
+                _iconData = tmpData.ToArray();
+            }
+            finally
+            {
+                if (hModule != IntPtr.Zero) NativeMethods.FreeLibrary(hModule);
+            }
+        }
+
+        private static byte[] GetDataFromResource(IntPtr hModule, IntPtr type, IntPtr name)
+        {
+            // Load the binary data from the specified resource.
+
+            var hResInfo = NativeMethods.FindResource(hModule, name, type);
+            if (hResInfo == IntPtr.Zero)
+                throw new Win32Exception();
+
+            var hResData = NativeMethods.LoadResource(hModule, hResInfo);
+            if (hResData == IntPtr.Zero)
+                throw new Win32Exception();
+
+            var pResData = NativeMethods.LockResource(hResData);
+            if (pResData == IntPtr.Zero)
+                throw new Win32Exception();
+
+            var size = NativeMethods.SizeofResource(hModule, hResInfo);
+            if (size == 0)
+                throw new Win32Exception();
+
+            var buf = new byte[size];
+            Marshal.Copy(pResData, buf, 0, buf.Length);
+
+            return buf;
+        }
+
+        public static Icon GetMainIcon()
+        {
+            var iex = new IconExtractor(Application.ExecutablePath);
+            return iex.Count > 0 ? iex.GetIcon(0) : null;
+        }
+    }
+}

+ 41 - 0
TurnoffMonitorOnLock/IconExtract/NativeMethods.cs

@@ -0,0 +1,41 @@
+using System;
+using System.Runtime.InteropServices;
+using System.Security;
+
+namespace TurnoffMonitorOnLock.IconExtract
+{
+    internal static class NativeMethods
+    {
+        [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
+        [SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr LoadLibraryEx(string lpFileName, IntPtr hFile, uint dwFlags);
+
+        [DllImport("kernel32.dll", SetLastError = true)]
+        [SuppressUnmanagedCodeSecurity]
+        public static extern bool FreeLibrary(IntPtr hModule);
+
+        [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
+        [SuppressUnmanagedCodeSecurity]
+        public static extern bool EnumResourceNames(IntPtr hModule, IntPtr lpszType, Enumresnameproc lpEnumFunc, IntPtr lParam);
+
+        [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
+        [SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr FindResource(IntPtr hModule, IntPtr lpName, IntPtr lpType);
+
+        [DllImport("kernel32.dll", SetLastError = true)]
+        [SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr LoadResource(IntPtr hModule, IntPtr hResInfo);
+
+        [DllImport("kernel32.dll", SetLastError = true)]
+        [SuppressUnmanagedCodeSecurity]
+        public static extern IntPtr LockResource(IntPtr hResData);
+
+        [DllImport("kernel32.dll", SetLastError = true)]
+        [SuppressUnmanagedCodeSecurity]
+        public static extern uint SizeofResource(IntPtr hModule, IntPtr hResInfo);
+    }
+
+    [UnmanagedFunctionPointer(CallingConvention.Winapi, SetLastError = true, CharSet = CharSet.Unicode)]
+    [SuppressUnmanagedCodeSecurity]
+    internal delegate bool Enumresnameproc(IntPtr hModule, IntPtr lpszType, IntPtr lpszName, IntPtr lParam);
+}

+ 66 - 0
TurnoffMonitorOnLock/MainForm.Designer.cs

@@ -0,0 +1,66 @@
+namespace TurnoffMonitorOnLock
+{
+    partial class MainForm
+    {
+        /// <summary>
+        /// 必需的设计器变量。
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// 清理所有正在使用的资源。
+        /// </summary>
+        /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows 窗体设计器生成的代码
+
+        /// <summary>
+        /// 设计器支持所需的方法 - 不要修改
+        /// 使用代码编辑器修改此方法的内容。
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.components = new System.ComponentModel.Container();
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));
+            this.MinisizeToTray = new System.Windows.Forms.NotifyIcon(this.components);
+            this.SuspendLayout();
+            // 
+            // MinisizeToTray
+            // 
+            this.MinisizeToTray.BalloonTipIcon = System.Windows.Forms.ToolTipIcon.Info;
+            this.MinisizeToTray.BalloonTipText = "Trun off monitor on lock screen";
+            this.MinisizeToTray.Text = "Trun off monitor on lock screen";
+            this.MinisizeToTray.Visible = true;
+            this.MinisizeToTray.Click += new System.EventHandler(this.MinisizeToTray_Click);
+            // 
+            // MainForm
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("$this.BackgroundImage")));
+            this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;
+            this.ClientSize = new System.Drawing.Size(351, 126);
+            this.MaximizeBox = false;
+            this.Name = "MainForm";
+            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+            this.Text = "Trun off monitor on lock screen";
+            this.Shown += new System.EventHandler(this.MainForm_Shown);
+            this.Resize += new System.EventHandler(this.MainForm_Resize);
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.NotifyIcon MinisizeToTray;
+    }
+}
+

+ 46 - 0
TurnoffMonitorOnLock/MainForm.cs

@@ -0,0 +1,46 @@
+using System.Windows.Forms;
+using Microsoft.Win32;
+using TurnoffMonitorOnLock.IconExtract;
+using TurnoffMonitorOnLock.MonitorPowerApi;
+
+namespace TurnoffMonitorOnLock
+{
+    public partial class MainForm : Form
+    {
+        public MainForm()
+        {
+            InitializeComponent();
+            var eIcon = IconExtractor.GetMainIcon();
+            if (null != eIcon)
+            {
+                Icon = eIcon;
+                MinisizeToTray.Icon = eIcon;
+            }
+            SystemEvents.SessionSwitch += delegate (object o, SessionSwitchEventArgs args)
+            {
+                if (args.Reason == SessionSwitchReason.SessionLock)
+                    MonitorPower.SetMonitorInState(MonitorState.MonitorStateOff);
+            };
+        }
+
+        private void MainForm_Shown(object sender, System.EventArgs e)
+        {
+            if (Program.CommandLineArgs.Count != 0) WindowState = FormWindowState.Minimized;
+        }
+
+        private void MainForm_Resize(object sender, System.EventArgs e)
+        {
+            if (WindowState != FormWindowState.Minimized) return;
+            Hide();
+            MinisizeToTray.Visible = true;
+            MinisizeToTray.ShowBalloonTip(5000, Text, "Im here", ToolTipIcon.Info);
+        }
+
+        private void MinisizeToTray_Click(object sender, System.EventArgs e)
+        {
+            MinisizeToTray.Visible = false;
+            Show();
+            WindowState = FormWindowState.Normal;
+        }
+    }
+}

+ 591 - 0
TurnoffMonitorOnLock/MainForm.resx

@@ -0,0 +1,591 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="MinisizeToTray.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="$this.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        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
+        4MGD+NLRo0fxJXJkgkMiWQRm9uzZ+n/tsBaGMkabAIy/WNBhvD82Jmrq1MTJoSGTwqP/LSLxzp89fPuD
+        v7v1/mduf+A3dzz47M9+9dJjL77+6z+88fTLbz336sznX//0xTdn/eGdL15+b+4r788jJz372qxnXv3s
+        yb/NfPzPMx7+43sPvPT2vS+88fPnX7/3+bd+9PTfSD986q9PvjrrV3//7Im/ffrLlz989JUPSI+8/D6V
+        Sb/8w7tKD730jpI7owqPvvzWI39884k/v/u7tz/78ydJr85Oee2LVNLHcxaTZs5dovTJvBSlGV8kK33E
+        1Xkpny1Mn52cNWdJzvwl2YszCwtWrC+tbKxr7Wrq7G3p7m3b0se2kxBjj/1RIDl7E3ahFRUVaWlp9957
+        L4z+27/9G+aiEG8h6wXhR3iE3XvbL/JERoQRw4bGTJkcM/XWux/68X1PTf/hwz++99c/+Oljjzz+4tO/
+        +cuzv/vLMy+/99xfZrz46id/eGPWy2/N/vO7c//y3jzy59+e+9s3Zj/9mnGnJ/7y0cOvzHjwpffuf/Gd
+        +154+2fPvXHPb17DnX7w67889frsx//6Ce6EFyk5RwpwoQB3evyVDx97+YNH//j+E3+a8dybX/zlk9Q3
+        5uSQ3v0iifTenEXvz03+YN5iJcqfzE/FhT6euwRfIqf86YI0PGpBSl5yRlFabjHutK6itrqpo7FjS1vP
+        9t6t3l+ZJNDYbf8bVONOPV1lZWVLliz5xS9+QUzBfhYvwqluvvlmz3zjjfEXi+j4hKjoWKLr+Ni4WPPX
+        9sJRDPvl3XDGw9yIDI9IjE+47ZZbb7np5pum3XDrrdNvu+12l6ZPv0OFu6bfpnTH7V663aY777zzrrvu
+        uuOOO6ZPn/7www8/9NBDDz74IPZ6+KHHSL/8xaOkhx58xKVfPPAwyX9G6cEHf3X//Y//4hdPPvbYb556
+        6kXSk08+/6tf/e6RX3vp0aee96dfPvXCQ79+nkSB9Mgzv3/02Zce+80fnnrhz6RnX/rbi395409vvP/3
+        dz9+c8an7336BUhJSUlOTk5PT8/IyJg7d+5rr712zz33yAiJiYmYiIACgiljHM98QfgQGZsQF59IwXyR
+        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
+        SUVORK5CYII=
+</value>
+  </data>
+</root>

+ 15 - 0
TurnoffMonitorOnLock/MonitorPowerApi/MonitorPower.cs

@@ -0,0 +1,15 @@
+using System.Runtime.InteropServices;
+
+namespace TurnoffMonitorOnLock.MonitorPowerApi
+{
+    internal static class MonitorPower
+    {
+        [DllImport("user32.dll")]
+        private static extern int PostMessage(int hWnd, int hMsg, int wParam, int lParam);
+
+        public static void SetMonitorInState(MonitorState state)
+        {
+            PostMessage(0xFFFF, 0x112, 0xF170, (int)state);
+        }
+    }
+}

+ 9 - 0
TurnoffMonitorOnLock/MonitorPowerApi/MonitorState.cs

@@ -0,0 +1,9 @@
+namespace TurnoffMonitorOnLock.MonitorPowerApi
+{
+    public enum MonitorState
+    {
+        MonitorStateOn = -1,
+        MonitorStateOff = 2,
+        MonitorStateStandBy = 1
+    }
+}

+ 22 - 0
TurnoffMonitorOnLock/Program.cs

@@ -0,0 +1,22 @@
+using System;
+using System.Collections.Generic;
+using System.Windows.Forms;
+
+namespace TurnoffMonitorOnLock
+{
+    internal static class Program
+    {
+        private static IList<string> _commandLineArgs;
+        internal static IList<string> CommandLineArgs => new List<string>(_commandLineArgs);
+
+        [STAThread]
+        private static void Main(string[] args)
+        {
+            _commandLineArgs = args;
+
+            Application.EnableVisualStyles();
+            Application.SetCompatibleTextRenderingDefault(false);
+            Application.Run(new MainForm());
+        }
+    }
+}

+ 86 - 0
TurnoffMonitorOnLock/TurnoffMonitorOnLock.csproj

@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="..\packages\ILRepack.2.0.15\build\ILRepack.props" Condition="Exists('..\packages\ILRepack.2.0.15\build\ILRepack.props')" />
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{DCCAC287-A269-4AAD-B71D-48DCBD7BC907}</ProjectGuid>
+    <OutputType>WinExe</OutputType>
+    <RootNamespace>TurnoffMonitorOnLock</RootNamespace>
+    <AssemblyName>TurnoffMonitorOnLock</AssemblyName>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
+    <NuGetPackageImportStamp>
+    </NuGetPackageImportStamp>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup>
+    <ApplicationIcon>Icon.ico</ApplicationIcon>
+  </PropertyGroup>
+  <PropertyGroup>
+    <RunPostBuildEvent>OnOutputUpdated</RunPostBuildEvent>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Deployment" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="IconExtract\IconExtractor.cs" />
+    <Compile Include="MainForm.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="MainForm.Designer.cs">
+      <DependentUpon>MainForm.cs</DependentUpon>
+    </Compile>
+    <Compile Include="IconExtract\NativeMethods.cs" />
+    <Compile Include="MonitorPowerApi\MonitorPower.cs" />
+    <Compile Include="MonitorPowerApi\MonitorState.cs" />
+    <Compile Include="Program.cs" />
+    <EmbeddedResource Include="MainForm.resx">
+      <DependentUpon>MainForm.cs</DependentUpon>
+    </EmbeddedResource>
+    <None Include="packages.config" />
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="Icon.ico" />
+  </ItemGroup>
+  <ItemGroup>
+    <Folder Include="Properties\" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
+    <PropertyGroup>
+      <ErrorText>这台计算机上缺少此项目引用的 NuGet 程序包。使用“NuGet 程序包还原”可下载这些程序包。有关更多信息,请参见 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是 {0}。</ErrorText>
+    </PropertyGroup>
+    <Error Condition="!Exists('..\packages\ILRepack.2.0.15\build\ILRepack.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\ILRepack.2.0.15\build\ILRepack.props'))" />
+  </Target>
+  <PropertyGroup>
+    <PostBuildEvent>if $(ConfigurationName) == Release if not exist $(TargetDir)Packed md $(TargetDir)Packed
+if $(ConfigurationName) == Release $(ILRepack) /ndebug /out:$(TargetDir)Packed\$(TargetFileName) $(TargetPath)</PostBuildEvent>
+  </PropertyGroup>
+</Project>

+ 4 - 0
TurnoffMonitorOnLock/packages.config

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="ILRepack" version="2.0.15" targetFramework="net461" />
+</packages>