sách gpt4 ai đã đi

c# - 打开/关闭显示电源时触发的事件

In lại 作者:行者123 更新时间:2023-11-30 21:27:58 58 4
mua khóa gpt4 Nike

我搜索一个事件,如果不存在,则搜索一种方法来了解屏幕是否关闭(电源选项 - 控制面板 - 关闭显示设置)。

这些解决方案都不适合我。
所以要么我在某个地方错了,要么就是不合适。

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);
}

1 Câu trả lời

声明大部分是正确的,您只需要在收到通知时处理消息即可。

覆盖 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");
phá vỡ;
case 1:
Console.WriteLine("Monitor Power On");
phá vỡ;
case 2:
Console.WriteLine("Monitor Dimmed");
phá vỡ;
}
}
m.Result = (IntPtr)1;
phá vỡ;
}
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/

58 4 0
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com