single.php

C# WinUI3でディスプレイを切断する方法

C# WinUI 3アプリを作っていく途中で、調べたことを忘録的に投稿します。今回はWinUI3プロジェクトで接続されている有効なモニター(ディスプレイ)を切断する方法です。

有効なモニターを取得

こんな感じでパソコンに接続されたモニターの一覧を取得します。詳細は別記事をご覧ください。

https://blog.janjan.net/2025/05/21/c-sharp-winui3-active-display-monitor-list

[SetDisplayConfig]で設定

Win32 APIの[SetDisplayConfig]関数に有効なモニターの一覧を取得時に利用した[QueryDisplayConfig]の戻り値を使って設定を行います。

[DllImport("user32.dll")]
public static extern int SetDisplayConfig(uint numPathArrayElements, [In] DISPLAYCONFIG_PATH_INFO[] pathArray, uint numModeInfoArrayElements, [In] DISPLAYCONFIG_MODE_INFO[] modeInfoArray, uint flags);

構造体や列挙値については別記事をご覧ください。

モニターの一覧を選択して切断

Xamlに一覧を表示するコンボボックスと切断するためのイベント用のボタンを追加します。

<Grid VerticalAlignment="Center" HorizontalAlignment="Center">
  <StackPanel Orientation="Horizontal">
    <ComboBox Name="MonitorList" Width="120"></ComboBox>
    <Button Name="Disable" Click="Disable_Click" Margin="4,0,0,0">Disable</Button>
  </StackPanel>
</Grid>

最後に、選択したコンボボックスのモニター切断するコードを追加します。

private int GetMonitorArray(ref DISPLAYCONFIG_PATH_INFO[]? pathArray, ref DISPLAYCONFIG_MODE_INFO[]? modeArray, ref uint PathArrayLength, ref uint ModeArrayLength)
{
  QUERY_DEVICE_CONFIG_FLAGS filter = QUERY_DEVICE_CONFIG_FLAGS.QDC_ONLY_ACTIVE_PATHS;
    QUERY_DEVICE_CONFIG_FLAGS filter = QUERY_DEVICE_CONFIG_FLAGS.QDC_ALL_PATHS;

  int Result = GetDisplayConfigBufferSizes(filter, ref PathArrayLength, ref ModeArrayLength);
  if (Result == ERROR_SUCCESS)
  {
    pathArray = new DISPLAYCONFIG_PATH_INFO[PathArrayLength];
    modeArray = new DISPLAYCONFIG_MODE_INFO[ModeArrayLength];
    Result = QueryDisplayConfig(filter, ref PathArrayLength, pathArray, ref ModeArrayLength, modeArray, IntPtr.Zero);
  }
  return Result;
}

private static uint DISPLAYCONFIG_PATH_ACTIVE = 0x00000001;

private void Disable_Click(object sender, RoutedEventArgs e)
{
  int Index = MonitorList.SelectedIndex;

  uint PathArrayLength = 0;
  uint ModeArrayLength = 0;
  DISPLAYCONFIG_PATH_INFO[]? pathArray = null;
  DISPLAYCONFIG_MODE_INFO[]? modeArray = null;

  if (GetMonitorArray(ref pathArray, ref modeArray, ref PathArrayLength, ref ModeArrayLength) == ERROR_SUCCESS)
  {
    if (pathArray == null || modeArray == null)
    {
      return;
    }

    if (pathArray[Index].flags == 1)
    {
      pathArray[Index].flags = 0;
      uint flags = SDC_APPLY | SDC_USE_SUPPLIED_DISPLAY_CONFIG | SDC_ALLOW_CHANGES;
      SetDisplayConfig((uint)pathArray.Length, pathArray, (uint)modeArray.Length, modeArray, flags);
    }
}

実行すると有効なモニターの名前がコンボボックスに追加されます。(私の場合、同じ機種のモニターが2つあるので一覧では同じ名前になっています)

[Disable]ボタンをクリックすると、選択したディスプレイが切断されて無効になります。

まとめ

今回は、WinUI3プロジェクトで有効なモニター(ディスプレイ)を切断(無効に)する方法について書きました。

Win32APIの[SetDisplayConfig]を利用して有効なモニターを切断が可能です。

WinUI 3で、有効なモニター(ディスプレイ)を切断したい人の参考になれば幸いです。

スポンサーリンク

最後までご覧いただき、ありがとうございます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です