|
分類:[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再起動なしでモードを切り替える方法
その他、別方法がございましたら、お教えください。
よろしくお願いいたします。
|