C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Windows 11 タブレットモードの設定

[トピック内 2 記事 (1 - 2 表示)]  << 0 >>

■103648 / inTopicNo.1)  Windows 11 タブレットモードの設定
  
□投稿者/ 河童 (1回)-(2025/05/06(Tue) 13:58:02)

分類:[C#] 

開発環境
Windows 11 pro
C#
VS2019
.NET Framework 4.7.2
Windowsフォームアプリケーション(.Net Framework)でプロジェクトを作成しています。

2年前にも同じ質問(101639)をさせていただきました。

【現象】
Windows 10では問題なかったフォーム画面が、
Windows 11では、Surface Go 4 でキーボード(タイプカバー)を外すと勝手に最大化される。

【原因】
Windows 11では「タブレットモード」が廃止され、自動的に端末の状態(キーボード有無)に応じたモード切り替えが行われる。
タイプカバーを外すとタブレットとして認識され、フォームが最大化される動きになる。

【対策】
MaximizeBox:False に設定する
または、Windows 10 にダウングレード

今回、Winodows10 のサポートがきれるということで再度解決策を考えているところです。

レジストリを修正することでモードを切り替えることはできました。
しかし、もう少し良くしたい箇所があります。

改善策1:バッチファイルでモード切替
下記URL を参考にタスクスケジュールに設定しました。
https://qiita.com/kazu_iroiro/items/15e6ee3a6f1d1b66e48a
モードの切り替えはできましたが、変更時に画面が一瞬チラつく問題がある。
タイプカバーの脱着以外でも実行されて、チラつきが多いです。


改善策2:フォームのロード時にモード切替
起動時のフォームにロード時の処理を追加しました。
モードの切替自体はできました。
しかし、起動時のフォームにはモードが適用されないので、PGを閉じて再度開く作業必要です。

        private void SetConvertibleSlateMode()
       {
            const string regPath = @"SYSTEM\CurrentControlSet\Control\PriorityControl";
            const string regName = "ConvertibleSlateMode";

            using (RegistryKey key = Registry.LocalMachine.OpenSubKey(regPath, writable: true))
            {
                if (key != null)
                {
                    key.SetValue(regName, 1, RegistryValueKind.DWord);
                }
                else
                {
                    throw new Exception("レジストリキーが開けませんでした。");
                }
            }
        }

        private bool IsRunAsAdmin()
        {
            try
            {
                WindowsIdentity identity = WindowsIdentity.GetCurrent();
                WindowsPrincipal principal = new WindowsPrincipal(identity);
                return principal.IsInRole(WindowsBuiltInRole.Administrator);
            }
            catch
            {
                return false;
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                if (IsRunAsAdmin())
                {
                    SetConvertibleSlateMode();
                    MessageBox.Show("ConvertibleSlateMode を 1 に設定しました。", "成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                {
                    MessageBox.Show("レジストリの変更には管理者権限が必要です。", "権限エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show($"エラーが発生しました: {ex.Message}", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }


教えていただきたいこと
・タスク実行時の画面チラつき防止
・PG再起動なしでモードを切り替える方法

その他、別方法がございましたら、お教えください。
よろしくお願いいたします。



引用返信 編集キー/
■103649 / inTopicNo.2)  Re[1]: Windows 11 タブレットモードの設定
□投稿者/ とっちゃん (844回)-(2025/05/06(Tue) 15:04:26)
No103648 (河童 さん) に返信
> 教えていただきたいこと
> ・タスク実行時の画面チラつき防止
> ・PG再起動なしでモードを切り替える方法
>
タスク実行時に画面がちらつくのは、画面モードが変わってしまうことに起因する問題ではありませんか?
例えば、何も画面がない状態で切り替えを行ったら発生しないとか…
そういうことだとすると、対策はないと思います(通常状態&#8596;最大化で行き来するとそれなりにちらつくのと同じ)

PG再起動なしでの切り替えですが、
Loadのタイミングではなく、Program.cs で、Run( new Form1() ); を呼び出す前に
切り替えるようにすれば、行けるのでは?と思います。

手元に環境がないので、試していませんので、実現できるかわかりませんが
試してみてはいかがでしょうか?

引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ