OMEN デスクトップPC (45L) でWindowsが起動したらサインイン前にLEDを消灯する
OMEN デスクトップPC (45L) でWindowsが起動したらサインイン前にLEDを消灯する方法を紹介します。
概要
OMEN by HPのデスクトップマシンでは、LEDのライティング制御を"OMEN Gaming Hub"のアプリケーションで制御します。
しかし、OMEN Gaming Hubが自動起動するのは、Windowsにサインイン(ログイン)した後になります。電源を投入してから、Windowsにサインインするまでは、
デフォルトのレインボーのLEDアニメーションのライティングが点灯します。
電源投入時のレインボーアニメーションはよいとしても、Windowsが起動したらすぐにLEDアニメーションは停止させたいです。
この記事では、Windowsが起動したらサインイン前にLEDを消灯する方法を紹介します。
対応方法
LEDを制御しているライティングボードはHID準拠デバイスとして動作しています。
HIDデバイスに対してメッセージを送信すると、LEDの制御ができます。
Windowsサービスとしてプログラムを作成し、サービスに登録しておき、Windowsが起動したら自動でサービスを起動し、
サービスからHIDデバイスに対してLED照明OFFのメッセージを送信すれば、サインイン前にLEDの照明をOFFにできます。
LEDコントロールのメッセージ
LEDライティングボードのベンダーIDとプロダクトIDは次の通り
| ベンダーID | 0x103c |
| プロダクトID | 0x84fd |
前面ファンの消灯
ライティングボードのHIDデバイスに対して次のメッセージを送信するとLEDをOFFにできます。 (モデル GT22-1990jp の場合)
ライティングボードのメッセージサイズは58バイトです。
上部のファンのLEDライトをOFFにする
0x3a,0x12,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x07,0x01,0x00,0x00,0x00
中央のファンのLEDライトをOFFにする
0x3a,0x12,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x06,0x01,0x00,0x00,0x00
下部のファンのLEDライトをOFFにする
0x3a,0x12,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x05,0x01,0x00,0x00,0x00
正面のLED
正面のLEDライトの明るさを25%の白にする
0x3a,0x12,0x01,0x01,0x01,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,
0x02,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00
内部の照明
CPUブロックのLEDライトの明るさを100%の白にする
0x3a,0x12,0x01,0x01,0x01,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,
0x02,0x00,0x00,0x00,0x00,0x04,0x01,0x00,0x00,0x00
ライトバーのLEDライトの明るさを100%の白にする
0x3a,0x12,0x01,0x01,0x01,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,
0x02,0x00,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00
または
0x3a,0x12,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,
0x02,0x00,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00
ライティングボードへのメッセージ仕様(未完成)
| バイト | 意味 |
| 1 | 0x3a で固定のようだ |
| 2 | 0x12 で固定のようだ |
| 3 | ON: 0x01, OFF: 0x05, ウェーブ(ギャラクシー)の場合: 0x09 |
| 4 | 3バイト位置の値が 0x01 の場合は 0x01、 3バイト位置の値が 0x05 の場合は0x00 / 旧バージョン:0x01 で固定のようだ |
| 5 | 3バイト位置の値が 0x01 の場合は 0x01、 3バイト位置の値が 0x05 の場合は0x00 / 旧バージョン:0x01 で固定のようだ |
| 6-7 | 0x00 で固定のようだ |
| 8-10 | R, G, B の値 |
| 11-13 | R, G, B の値 (1番目のカラー) |
| 14-16 | R, G, B の値 (2番目のカラー) |
| 17-19 | R, G, B の値 (3番目のカラー) |
| 20-22 | R, G, B の値 (4番目のカラー) |
| 23-25 | R, G, B の値 (5番目のカラー) |
| 26-28 | R, G, B の値 (6番目のカラー) |
| 29-47 | 0x00 で固定のようだ |
| 48 | LEDの明るさ: 100% 0x64, 75% 0x4B, 50% 0x32, 25% 0x19 |
| 49 | LEDの明るさを設定する場合: 0x02 |
| 50-53 | 0x00 で固定のようだ |
| 54 | 変更対象のLED - 0x01:フロントLED, 0x02:ケース内ライトバー, 0x04: CPU水冷ブロック照明, 0x05:下フロントファン, 0x06:中フロントファン, 0x07:上フロントファン |
| 55 | 0x01 で固定のようだ1 |
| 56 | 常時点灯 OFFの場合:0x00, ウェーブ(ギャラクシー)の場合:0x01 |
| 57 | 常時点灯 OFFの場合:0x00, ウェーブ(ギャラクシー)の場合:0x02 |
| 58 | x0xx 終端 |
補足
メモリ(DIMM)のLEDライティングはメモリ自体でコントロールしているため、ライティングボード経由では設定できません。
Windowsサービスを利用する方法
LED照明をOffにするサービスを作成します。C#で作成します。
プロジェクト設定
「ワーカーサービス」のプロジェクトテンプレートからアプリケーションを作成します。
.NET Framework 4.8などで作成したい場合は、Windows サービス(.NET Framework)のテンプレートで作成することもできます。

パッケージ
NuGetで以下のパッケージをインストールします。
HIDLibraryはHID機器(USBデバイス)と通信するためのライブラリです。
Microsoft.Extensions.Hosting.WindowsServicesはWindowsサービスを作成するためのライブラリです。
- hidlibrary
- Microsoft.Extensions.Hosting.WindowsServices
コード
以下のコードを記述します。
using OmenLEDWorkerService;
using Microsoft.Extensions.Logging.Configuration;
using Microsoft.Extensions.Logging.EventLog;
HostApplicationBuilder builder = Host.CreateApplicationBuilder(args);
builder.Services.AddWindowsService(options =>
{
options.ServiceName = "OMEN by HP LED Control Service for iPentec";
});
builder.Services.AddHostedService<Worker>();
IHost host = builder.Build();
host.Run();
using HidLibrary;
namespace OmenLEDWorkerService
{
public class Worker : BackgroundService
{
private readonly ILogger<Worker> _logger;
internal const int VendorId = 0x103c;
internal const int ProductId = 0x84fd;
internal HidDevice _device;
public Worker(ILogger<Worker> logger)
{
_logger = logger;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
SendReportToDevice();
}
private void SendReportToDevice()
{
_device = HidDevices.Enumerate(VendorId, ProductId).FirstOrDefault();
if (_device != null) {
_device.OpenDevice();
_device.Inserted += DeviceAttachedHandler;
HidReport hreport = new HidReport(59);
//フロントLED白 25%
hreport.Data = new byte[]{
0x3a,0x12,0x01,0x01,0x01,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,
0x02,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00
};
SendReport(hreport);
//ライトバー白 100%
hreport.Data = new byte[]{
0x3a,0x12,0x01,0x01,0x01,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,
0x02,0x00,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00
};
SendReport(hreport);
//CPUブロック白 100%
hreport.Data = new byte[]{
0x3a,0x12,0x01,0x01,0x01,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,
0x02,0x00,0x00,0x00,0x00,0x04,0x01,0x00,0x00,0x00
};
SendReport(hreport);
//上ファンOFF
hreport.Data = new byte[]{
0x3a,0x12,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x07,0x01,0x00,0x00,0x00
};
SendReport(hreport);
//中ファンOFF
hreport.Data = new byte[]{
0x3a,0x12,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x06,0x01,0x00,0x00,0x00
};
SendReport(hreport);
//下ファンOFF
hreport.Data = new byte[]{
0x3a,0x12,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x05,0x01,0x00,0x00,0x00
};
SendReport(hreport);
}
_device.CloseDevice();
}
internal void DeviceAttachedHandler()
{
}
internal void SendReport(HidReport rep)
{
if (_device.WriteReport(rep) == true) {
}
else {
}
}
}
}
解説
SendReportToDevice()メソッドで、HIDデバイスにメッセージを送信しLEDの明るさや消灯を制御します。
プログラムの発行
プロジェクトの発行でディレクトリにプログラムを発行します。プロファイルの設定は以下です。
[配置モード]を"自己完結"に設定しています。

[ファイルの公開オプション]で"単一ファイルの作成"にチェックをつけています。

プログラムを発行します。exeファイルが作成されました。

サービスのインストール
作成されたexeファイルを配置して、管理者モードでコマンドプロンプト、またはPowerShellを起動し、以下のコマンドを実行してサービスとして登録します。
今回の例ではファイルはC:\Tools iPentec\OmenLEDWorkerServiceに配置しています。
sc.exe create "OMEN LED Service for iPentec" binpath="C:\Tools iPentec\OmenLEDWorkerService\OmenLEDWorkerService.exe"
成功すると以下のメッセージが表示されます。
[SC] CreateService SUCCESS
サービスを開きます。サービス一覧に先ほど追加した、 "OMEN LED Service for iPentec" が登録されていることを確認します。

ダブルクリック、または右クリックしてポップアップメニューの[プロパティ]の項目をクリックして、プロパティダイアログを表示します。
スタートアップの種類が[手動]になっている場合は、[自動]に変更します。

Fast Bootの無効化
Fast Bootが有効な場合、サービスが開始状態からスタートしない場合があるため、Fast Bootを無効化します。
Fast Boot無効化の手順はこちらの記事を参照してください。
動作確認
マシンの電源をOFFにして、再度電源投入をして、レインボーのライティングが点灯することを確認します。
Windowsが起動すると、サインイン前状態でもフロントファンのLEDが消灯することを確認します。
タスクスケジューラーを利用する方法
起動時に1回だけ実行できれば良いため、サービスにプログラムを登録したくない場合にはタスクスケジューラーを利用して、
起動時にプログラムを1回実行する方法もあります。
LED照明をOffにするプログラムを作成します。C#で作成します。
プロジェクト設定
[コンソール アプリ]のプロジェクトテンプレートからアプリケーションを作成します。
.NET Framework 4.8などで作成したい場合は、[コンソール アプリ (.NET Framework)]のテンプレートで作成することもできます。

パッケージ
NuGetで以下のパッケージをインストールします。
HIDLibraryはHID機器(USBデバイス)と通信するためのライブラリです。
コード
以下のコードを記述します。
// See https://aka.ms/new-console-template for more information
using OmenLEDControl;
OmenLedController c = new OmenLedController();
c.Exec();
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using HidLibrary;
namespace OmenLEDControl
{
internal class OmenLedController
{
internal const int VendorId = 0x103c;
internal const int ProductId = 0x84fd;
internal HidDevice _device;
internal StreamWriter sw;
public void Exec()
{
sw = new StreamWriter("app.log",true);
SendReportToDevice();
sw.WriteLine("Complete:"+ DateTimeOffset.Now.ToString());
sw.Close();
}
internal void SendReportToDevice()
{
_device = HidDevices.Enumerate(VendorId, ProductId).FirstOrDefault();
if (_device != null) {
_device.OpenDevice();
_device.Inserted += DeviceAttachedHandler;
HidReport hreport = new HidReport(59);
//フロントLED白 25%
hreport.Data = new byte[]{
0x3a,0x12,0x01,0x01,0x01,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,
0x02,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00
};
SendReport(hreport);
//ライトバー
hreport.Data = new byte[]{
0x3a,0x12,0x01,0x01,0x01,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,
0x02,0x00,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00
};
SendReport(hreport);
//CPUブロック
hreport.Data = new byte[]{
0x3a,0x12,0x01,0x01,0x01,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,
0x02,0x00,0x00,0x00,0x00,0x04,0x01,0x00,0x00,0x00
};
SendReport(hreport);
//上ファンOFF
hreport.Data = new byte[]{
0x3a,0x12,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x07,0x01,0x00,0x00,0x00
};
SendReport(hreport);
//中ファンOFF
hreport.Data = new byte[]{
0x3a,0x12,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x06,0x01,0x00,0x00,0x00
};
SendReport(hreport);
//下ファンOFF
hreport.Data = new byte[]{
0x3a,0x12,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x05,0x01,0x00,0x00,0x00
};
SendReport(hreport);
_device.CloseDevice();
}
else {
sw.WriteLine("Device Null:" + DateTimeOffset.Now.ToString());
}
}
internal void DeviceAttachedHandler()
{
}
internal void SendReport(HidReport rep)
{
if (_device.WriteReport(rep) == true) {
sw.WriteLine("WriteReport OK:" + DateTimeOffset.Now.ToString());
}
else {
sw.WriteLine("WriteReport NG:" + DateTimeOffset.Now.ToString());
}
}
}
}
発行
フォルダーに発行します。

タスクスケジューラーの設定
発行されたプログラムを配置ディレクトリにコピーします。
タスクスケジューラーを開き、タスクを作成します。
タスクのプロパティは次の通りです。
タスクの実行時に使用するユーザーアカウントは、"SYSTEM"アカウントにします。
SYSTEMアカウントを設定すると"ユーザーがログインしているかどうかにかかわらず実行する"モードになります。
[最上位の特権で実行する]にチェックをつけておきます。(チェックしなくても動作します)

[トリガー]は[スタートアップ時]の[システム起動時]を設定します。

[操作]は[プログラムの開始]を設定します。実行するプログラムは今回作成したコンソールアプリケーションの実行ファイルです。

[条件]の設定です。

[設定]画面の設定状態です。

Fast Bootの無効化
Fast Bootが有効な場合、タスクスケジューラーの[システム起動時]の設定で、システム起動時に、
[操作]に設定したプログラムが実行されない場合があるため、Fast Bootを無効化します。
Fast Boot無効化の手順はこちらの記事を参照してください。
動作確認
マシンの電源をOFFにして、再度電源投入をして、レインボーのライティングが点灯することを確認します。
Windowsが起動すると、サインイン前状態でもフロントファンのLEDが消灯することを確認します。
サインイン前にフロントLEDの照明を消すことができました。
補足
メモリ(DIMM)のLEDライティングはメモリ自体でコントロールしており、ライティングボード経由では設定できないため、
サインインしてOMEN Gaming Hubが起動するまではレインボーの照明が点灯し続けます。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用