- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我搜索一个事件,如果不存在,则搜索一种方法来了解屏幕是否关闭(电源选项 - 控制面板 - 关闭显示设置)。
这些解决方案都不适合我。
所以要么我在某个地方错了,要么就是不合适。
How to get the events when the screen/display goes to power OFF or ON?
我期待一些轨道或解决方案。
问题是我不知道自己在做什么,如果你能帮我多一点就太好了。
我做了这个,但它不起作用:
internal static class NativeMethods
{
public static Guid GUID_MONITOR_POWER_ON = new Guid(0x02731015, 0x4510, 0x4526, 0x99, 0xE6, 0xE5, 0xA1, 0x7E, 0xBD, 0x1A, 0xEA);
public const int DEVICE_NOTIFY_WINDOW_HANDLE = 0x00000000;
public const int WM_POWERBROADCAST = 0x0218;
public const int PBT_POWERSETTINGCHANGE = 0x8013;
[StructLayout(LayoutKind.Sequential, Pack = 4)]
public struct POWERBROADCAST_SETTING
{
public Guid PowerSetting;
public uint DataLength;
public byte Data;
}
[DllImport(@"User32", SetLastError = true, EntryPoint = "RegisterPowerSettingNotification", CallingConvention = CallingConvention.StdCall)]
public static extern IntPtr RegisterPowerSettingNotification(IntPtr hRecipient, ref Guid PowerSettingGuid, Int32 Flags);
[DllImport(@"User32", SetLastError = true, EntryPoint = "UnregisterPowerSettingNotification", CallingConvention = CallingConvention.StdCall)]
public static extern bool UnregisterPowerSettingNotification(IntPtr handle);
}
private void WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
Debug.WriteLine("EVENT", "DEBUG");
}
public form1()
{
NativeMethods.RegisterPowerSettingNotification(this.Handle, ref NativeMethods.GUID_MONITOR_POWER_ON, NativeMethods.DEVICE_NOTIFY_WINDOW_HANDLE);
}
最佳答案
声明大部分是正确的,您只需要在收到通知时处理消息即可。
覆盖 OnHandleCreated , 以确保将窗口句柄传递给函数时有效。
覆盖 WndProc , 接收和处理 WM_POWERBROADCAST
事件。请注意,Windows 8+ 中使用的 Guid 与 Window 7 中使用的不同。不多,在 Windows 8+ 中也可用 POWERBROADCAST_SETTING.Data
0x02
的值,包括 Monitor Dimmed
状态;无论如何,建议您改用此 Guid。
您可以查看 OSVersion在打电话之前 RegisterPowerSettingNotification .
此函数返回一个句柄 (IntPtr
),用于调用 UnregisterPowerSettingNotification之后。
一旦您的应用程序开始处理消息,就会发送第一个通知(您应该会收到一条消息,通知您监视器已打开:)。
请注意,当系统打开/关闭或调暗显示器电源时会通知这些事件,如果您打开/关闭显示器的电源按钮则不会。
public partial class Form1 : Form
{
private IntPtr unRegPowerNotify = IntPtr.Zero;
protected override void OnHandleCreated(EventArgs e)
{
base.OnHandleCreated(e);
var settingGuid = new NativeMethods.PowerSettingGuid();
Guid powerGuid = IsWindows8Plus()
? settingGuid.ConsoleDisplayState
: settingGuid.MonitorPowerGuid;
unRegPowerNotify = NativeMethods.RegisterPowerSettingNotification(
this.Handle, powerGuid, NativeMethods.DEVICE_NOTIFY_WINDOW_HANDLE);
}
private bool IsWindows8Plus()
{
var version = Environment.OSVersion.Version;
if (version.Major > 6) return true; // Windows 10+
if (version.Major == 6 && version.Minor > 1) return true; // Windows 8+
return false; // Windows 7 or less
}
protected override void WndProc(ref Message m)
{
switch (m.Msg) {
case NativeMethods.WM_POWERBROADCAST:
if (m.WParam == (IntPtr)NativeMethods.PBT_POWERSETTINGCHANGE)
{
var settings = (NativeMethods.POWERBROADCAST_SETTING)m.GetLParam(
typeof(NativeMethods.POWERBROADCAST_SETTING));
switch (settings.Data) {
case 0:
Console.WriteLine("Monitor Power Off");
break;
case 1:
Console.WriteLine("Monitor Power On");
break;
case 2:
Console.WriteLine("Monitor Dimmed");
break;
}
}
m.Result = (IntPtr)1;
break;
}
base.WndProc(ref m);
}
protected override void OnFormClosing(FormClosingEventArgs e)
{
NativeMethods.UnregisterPowerSettingNotification(unRegPowerNotify);
base.OnFormClosing(e);
}
}
NativeMethods 声明:
using System.Runtime.InteropServices;
public class NativeMethods
{
internal const uint DEVICE_NOTIFY_WINDOW_HANDLE = 0x0;
internal const uint DEVICE_NOTIFY_SERVICE_HANDLE = 0x1;
internal const int WM_POWERBROADCAST = 0x0218;
internal const int PBT_POWERSETTINGCHANGE = 0x8013;
[DllImport("User32.dll", SetLastError = true)]
internal static extern IntPtr RegisterPowerSettingNotification(IntPtr hWnd, [In] Guid PowerSettingGuid, uint Flags);
[DllImport("User32.dll", SetLastError = true)]
internal static extern bool UnregisterPowerSettingNotification(IntPtr hWnd);
[StructLayout(LayoutKind.Sequential, Pack = 4)]
internal struct POWERBROADCAST_SETTING
{
public Guid PowerSetting;
public uint DataLength;
public byte Data;
}
// https://learn.microsoft.com/en-us/windows/win32/power/power-setting-guids
public class PowerSettingGuid
{
// 0=Powered by AC, 1=Powered by Battery, 2=Powered by short-term source (UPC)
public Guid AcdcPowerSource { get; } = new Guid("5d3e9a59-e9D5-4b00-a6bd-ff34ff516548");
// POWERBROADCAST_SETTING.Data = 1-100
public Guid BatteryPercentageRemaining { get; } = new Guid("a7ad8041-b45a-4cae-87a3-eecbb468a9e1");
// Windows 8+: 0=Monitor Off, 1=Monitor On, 2=Monitor Dimmed
public Guid ConsoleDisplayState { get; } = new Guid("6fe69556-704a-47a0-8f24-c28d936fda47");
// Windows 8+, Session 0 enabled: 0=User providing Input, 2=User Idle
public Guid GlobalUserPresence { get; } = new Guid("786E8A1D-B427-4344-9207-09E70BDCBEA9");
// 0=Monitor Off, 1=Monitor On.
public Guid MonitorPowerGuid { get; } = new Guid("02731015-4510-4526-99e6-e5a17ebd1aea");
// 0=Battery Saver Off, 1=Battery Saver On.
public Guid PowerSavingStatus { get; } = new Guid("E00958C0-C213-4ACE-AC77-FECCED2EEEA5");
// Windows 8+: 0=Off, 1=On, 2=Dimmed
public Guid SessionDisplayStatus { get; } = new Guid("2B84C20E-AD23-4ddf-93DB-05FFBD7EFCA5");
// Windows 8+, no Session 0: 0=User providing Input, 2=User Idle
public Guid SessionUserPresence { get; } = new Guid("3C0F4548-C03F-4c4d-B9F2-237EDE686376");
// 0=Exiting away mode 1=Entering away mode
public Guid SystemAwaymode { get; } = new Guid("98a7f580-01f7-48aa-9c0f-44352c29e5C0");
/* Windows 8+ */
// POWERBROADCAST_SETTING.Data not used
public Guid IdleBackgroundTask { get; } = new Guid(0x515C31D8, 0xF734, 0x163D, 0xA0, 0xFD, 0x11, 0xA0, 0x8C, 0x91, 0xE8, 0xF1);
public Guid PowerSchemePersonality { get; } = new Guid(0x245D8541, 0x3943, 0x4422, 0xB0, 0x25, 0x13, 0xA7, 0x84, 0xF6, 0x79, 0xB7);
// The Following 3 Guids are the POWERBROADCAST_SETTING.Data result of PowerSchemePersonality
public Guid MinPowerSavings { get; } = new Guid("8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c");
public Guid MaxPowerSavings { get; } = new Guid("a1841308-3541-4fab-bc81-f71556f20b4a");
public Guid TypicalPowerSavings { get; } = new Guid("381b4222-f694-41f0-9685-ff5bb260df2e");
}
}
关于c# - 打开/关闭显示电源时触发的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56920822/
是否可以通过编程方式关闭 iPhone,或者 Apple 不允许这样做? 如果 Apple 不允许这样做,是否可以通过编程方式将 iPhone 静音? 最佳答案 您使用官方 SDK 创建的 iPhon
我目前正在使用 Phonegap Build (3.7) 构建一个简单(但有用)的移动应用程序。 我正在制作的应用程序需要模拟信息亭模式类型的应用程序,因此该设备将仅与该应用程序一起使用,而不会用于其
当使用 numpy.power(2,N) 时,N 是一个整数,我遇到了以下问题: In[1] np.power(2,63) Out[1] -9223372036854775808 RuntimeWar
我的老板想从 Reporting Services 切换到 Power View,但他想知道您可以在 SSRS 中执行的所有操作是否首先在 Power View 中可用。 我立即注意到的一件事是我无法
我希望当我的应用程序运行时,电源按钮(按下时锁定屏幕并且屏幕变黑)应该被禁用。使用户无法锁定屏幕。 我在三星 Galaxy S 手机的默认相机应用程序中注意到了这个东西。这就是我尝试做同样的事情的原因
我有包含字段 Amount, Condition1, Condition2 的表格。 例子: Amount Condition1 Condition2 ---------------------
我正在计算给定时间范围内每月唯一 ID 的数量,但我遇到了两件奇怪的事情: 1. 寻找相同的东西,但使用两种不同的方法(每个月的值和逐月的累积值)给出不同的值。请参阅下面的屏幕截图。 2.当您在第一列
是否可以使用 Linux 手动打开/关闭 USB 电源? 有一个外部 USB 冷却风扇(你用来冷却自己的那种,而不是 PC),如果能够从终端控制它会很好,因为我想把风扇放在很远的地方。 我想这对其他各
我刚刚开始使用 Power Bi,现在我需要一些帮助。 我需要一个公式来创建一个使用以下逻辑的新列(在下面的示例图片中称为“组合”): 在每个 ParentID 上构建 Current 列的总和 如果
我在 Power BI 的 Power Query 编辑器中运行 Python 脚本来转换和处理我的数据。在这些计算之后,我想将数据集和另一个表返回到 Power Query 编辑器。我是否正确认为第
我想为 Linux 上的 GPU 设备关闭“真正的”PCIe 电源。我找到了一些主页,但它们无法切断“真实”的力量。 我监测了交流电的使用情况,但所有这些都无法减少实际用电情况。你能告诉我如何关闭设备
我在使用 PowerShell 脚本通过 Power BI rest api 更新数据集参数时遇到了一些困难。 我的脚本基于这些资源: https://learn.microsoft.com/en-u
如何使用使用两个现有表作为输入的 Python 脚本创建新表?例如通过执行 left join使用 pandas merge ? 部分详情: 使用 Home > Edit queries您可以在 Tr
由于数据的 secret 性,我将尝试使用一些随机示例来描述我正在努力解决的问题。假设我在 Power BI 中有一个包含发票数据的事实表。我需要计算过去 12 个月销售额超过 50,000 欧元的不
我专门尝试使用 Power Query 编辑器将 Column A 中的字符串:yyyymmdd 转换为 dd/mm/yyyy 日期格式电源 BI。我已经可以使用以下公式在 Excel 中执行此操作:
我有一个方法: public class MarginConverter { int top = 0; int bottom = 0; int right = 0; i
这个问题衍生出了我之前发布的一个问题; Custom x-axis values in Power BI 假设以下数据集: 专注于第二排和第三排。我怎样才能使下面相应图表中的线是连续的而不是停在中间?
我是一名优秀的程序员,十分优秀!