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

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

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

Re[5]: Windows11 で


(過去ログ 177 を表示中)

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

■101639 / inTopicNo.1)  Windows11 で
  
□投稿者/ 河童 (38回)-(2023/03/22(Wed) 21:59:39)

分類:[C#] 

開発環境
Windows 11 pro
C#
VS2019
.NET Framework 4.7.2

Windowsフォームアプリケーション(.Net Framework)でプロジェクトを作成しています。
Form1からForm2をダイアログとして表示しています。
Form2のプロパティでWindowStateを「Normal」に設定しています。

// Form1からForm2を表示
private void button1_Click(object sender, EventArgs e)
{
Form2 f = new Form2();
f.ShowDialog();
}

困っている事は、Form2が画面最大状態で表示されることです。
プロパティでは「Nomal」にしているのにもかかわらずです。
サイズは「500,500」で画面中央に配置の設定もプロパティでしています。

この現象が発生するのは、ソフトを設定したSurface Go3です。
Surface Go3
Windows 11 pro
バージョン22H2
タイプカバー(純正)キーボード

発生するタイミングは、タイプカバーを外した後にForm2を開こうとした時です。
タイプカバーを着けてSurfaceを再起動して、Form2を開くと正常に表示されます。
タイプカバーの脱着でフォームの表示がおかしくなっている感じがします。

ノートパソコンのWindows 11 Homeで試してみると
この現象は発生しませんでした。

Windows11またはSurfaceGo3 の問題かもしれませんが、解決方法があれば教えていただきたいです。
よろしくお願いいたします。
引用返信 編集キー/
■101640 / inTopicNo.2)  Re[1]: Windows11 で
□投稿者/ 魔界の仮面弁士 (3605回)-(2023/03/23(Thu) 00:00:54)
2023/03/23(Thu) 02:18:30 編集(投稿者)

No101639 (河童 さん) に返信
> 発生するタイミングは、タイプカバーを外した後にForm2を開こうとした時です。
> タイプカバーを着けてSurfaceを再起動して、Form2を開くと正常に表示されます。
> タイプカバーの脱着でフォームの表示がおかしくなっている感じがします。

それは 2-in-1 PC やタブレット PC における「タブレット モード」の振る舞いでしょう。

「標準ではタブレットなのだが、キーボードを装着可能することでそれを認識してノートとして振舞うPC」や、
その逆に「普段はノートだが、キーボードを外す(あるいは畳む)ことでタブレットとして振舞うPC」が該当します。

タッチパネル搭載型(あるいは、タッチ非対応だがスタイラス対応のもの)の PC では、
専用キーボードを取り外した際に、それを認識して、キーバード・マウスなどの入力デバイスを
使用しない状態でも画面操作しやすいよう、タッチパネル(あるいはペン入力)での画面操作に
特化したモードへと自動的に切り替える仕組みがあります。それが「タブレット モード」です。

タブレット モードではデスクトップ モードとは違い、電卓やメモ帳などを含む
すべてのアプリが、【常に全画面表示】されるようになっています。
そのため、Form2 も全画面表示されてしまったのでしょう。
(全画面のまま、複数ウィンドウを分割表示することもできます)

アクションセンターを開き、タブレットモードが On/Off いずれの状態なのかを確認してみてください。
https://askpc.panasonic.co.jp/beginner/guide/ten03/3011.html

また、「設定」→「システム」→「タブレットモード」から、
タブレットモードを使わない設定にすることもできます。


> ノートパソコンのWindows 11 Homeで試してみると
> この現象は発生しませんでした。
Windows 11 ではタブレットモードが廃止されています。

また、Windows 10 PC であっても、タッチ対応の画面を搭載していない場合、
タブレットモードは通常、有効化された状態にはなっていないはずです。


> Form2 f = new Form2();
> f.ShowDialog();

それは f.Show(); の場合の呼び出し方ですよ?

f.ShowDialog(); で呼び出すのであれば、ShowDialog の後に
『f.Dispose();』と記述しておかなければいけません。

もしくは
 using (f = new Form2())
 {
  f.ShowDialog();
 }
のように、using ブロックで囲むべきです。


モーダルダイアログの場合、右上×の閉じるボタンを押したとしても、フォームが非表示になるだけです。
この時、Form2 のインスタンス変数 f に対して、f.DialogResult プロパティに DialogResult.Cancel がセットされることになります。
閉じられたとしても破棄はされないので、呼び出した側が明示的に Dispose してあげねばならない仕様です。

一方、非モーダル ダイアログ(すなわちモードレス ダイアログ) の場合は、閉じた時点で
フォームのインスタンスが自動的に破棄されますので、f.Dispose() を呼ぶ必要はありません。


たとえば、下記のコードを試してみてください。

Form2 f = new Form2();
f.FormClosed += delegate { System.Diagnostics.Debug.Print("Form2 Closed"); };
f.Disposed += delegate { System.Diagnostics.Debug.Print("Form2 Disposed"); };
f.Show();

出力ウィンドウを見てみると、Form2 が閉じられた時には、
FormClosed に続いて Disposed も発生していることが分かります。

しかし、Show() を ShowDialog() に置き換えてみた場合、Form2 を閉じたとしても
呼び出されるのは FormClosed だけであり、Disposed イベントは発生しないことが分かります。
これは、Close されたフォームがまだ非表示でメモリ上に残っているためです。
もちろん f.Dispose(); を呼び出せば、Disposed イベントが発生します。
引用返信 編集キー/
■101641 / inTopicNo.3)  Re[2]: Windows11 で
□投稿者/ 河童 (39回)-(2023/03/23(Thu) 09:42:48)
No101640 (魔界の仮面弁士 さん) に返信
> それは 2-in-1 PC やタブレット PC における「タブレット モード」の振る舞いでしょう。
そうですね。タブレットモードの振る舞いのような感じがします。

> Windows 11 ではタブレットモードが廃止されています。
今回PGを実行するのは、Surface Go3 でWindows11 となります。
廃止されているのにフォーム画面が最大化で表示されます。

> たとえば、下記のコードを試してみてください。
> Form2 f = new Form2();
> f.FormClosed += delegate { System.Diagnostics.Debug.Print("Form2 Closed"); };
> f.Disposed += delegate { System.Diagnostics.Debug.Print("Form2 Disposed"); };
> f.Show();
ありがとうございます。
画面上同じ見た目なのにPG内部にはいろんな仕組みがあるんですね。

試しに上記コードでも試してみました。
Surface Go2 Windows 10 Home バージョン22H2
タブレットモードは「オフ」の状態。
タイプカバーを着脱してもフォーム画面は最大化表示されません。
※ちなみにタブレットモード「オン」にしても画面は最大化されませんでした。

Surface Go3 Windows 11 Pro バージョン22H2
タブレットモードの設定はなし。
タイプカバーを着けた場合は、正常(最大化されない)。
タイプカバーを外した場合は、フォーム画面が最大化される。

タイプカバーを着けていれば問題ないのですが、
カメラを使う場合などはタイプカバーを外して操作したいときがあります。
Windows11 またはSurface Go3が原因かもしれませんが、
フォーム画面が最大化する問題を解決する方法はないでしょうか。
よろしくお願いいたします。
引用返信 編集キー/
■101643 / inTopicNo.4)  Re[3]: Windows11 で
□投稿者/ 魔界の仮面弁士 (3606回)-(2023/03/23(Thu) 10:40:02)
No101641 (河童 さん) に返信
> Surface Go2 Windows 10 Home バージョン22H2
> Surface Go3 Windows 11 Pro バージョン22H2

Surface Go は所有していないので、製品固有の振る舞いだとしたらちょっとわからないですね。
当方環境も 2-in-1 ですが、こちらは Surface Book 2 なので…。


>> Windows 11 ではタブレットモードが廃止されています。
> 今回PGを実行するのは、Surface Go3 でWindows11 となります。
> 廃止されているのにフォーム画面が最大化で表示されます。

Windows 11 では、アクションセンターからのタブレットモードの切り替えが廃止されましたが、
タブレット モードそのものは OS の機能として残っているようです。
https://www.ubackup.com/jp/articles/windows-11-stuck-in-tablet-mode.html


トリガーはおそらく、従来通りの ConvertibleSlateMode (デバイスに物理キーボードが装着されているかどうか) かと。
https://learn.microsoft.com/ja-jp/windows-hardware/customize/desktop/unattend/microsoft-windows-gpiobuttons-convertibleslatemode
https://stackoverflow.com/questions/31153664/


レジストリ 項目が Windows 10 時代と同じだとすれば、当方環境には
 HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\ImmersiveShell
の下にこのようなものがありました。Windows 11 でも同じかどうかは不明ですし、
これらの値と今回の振る舞いの因果関係までは調査していません。


TabletMode (DWORD)
 0 = Off
 1 = On


ConvertibleSlateModePromptPreference (DWORD) / このデバイスをタブレットとして使用するとき / デバイスがタブレット モードのオンとオフを自動的に切り替えるとき
 0 = Don't ask me and don't switch / 確認せず、切り替えも行わない
 0 = Don't switch tablet mode / タブレット モードに切り替えない
 1 = Always ask me before switching / 切り替える前に常に確認する
 1 = Ask me before switching modes / モードを切り替える前に確認メッセージを表示する
 2 = Always switch to tablet mode / 常にタブレット モードに切り替える
 2 = Don't ask me and always switch / 確認せず、常に切り替える


SignInMode (DWORD) / サインイン時の動作
 0 = Automatically switch to Tablet Mode / 常にタブレットモードを使用する
 1 = Go to the desktop / デスクトップモードを使用します / タブレットモードを使用しない
 2 = Remember what I used last / ハードウェアに適したモードを使用します



> 画面上同じ見た目なのにPG内部にはいろんな仕組みがあるんですね。
全画面化の件とは別の話ではあるのですが、忘れがちな点なので指摘させていただきました。
ヘルプで Form.ShowDialog メソッドの解説を読むと、Dispose が必要である点も明記されていますしね。


現行バージョンの資料は機械翻訳の質が悪くて読みにくいので、
あえて古い .NET Framework 3.5 世代の MSDN Library から引用:

|
| フォームがモーダル ダイアログ ボックスとして表示されている場合、閉じるボタン
| (フォームの右上隅の X が付いているボタン) をクリックするとフォームが非表示になり、
| DialogResult プロパティが DialogResult.Cancel に設定されます。モードレス フォームとは異なり、
| ユーザーがダイアログ ボックスの閉じるボタンをクリックするか、DialogResult プロパティの値を
| 設定した場合には、Close メソッドは .NET Framework によって呼び出されません。その場合は
| フォームが非表示になるだけで、ダイアログ ボックスの新しいインスタンスを作成しなくても
| そのフォームを再表示できます。ダイアログ ボックスとして表示されているフォームは
| Close メソッドで閉じられることはないため、フォームがアプリケーションで不要になった場合は、
| そのフォームの Dispose メソッドを呼び出す必要があります。
|
引用返信 編集キー/
■101644 / inTopicNo.5)  Re[4]: Windows11 で
□投稿者/ 河童 (40回)-(2023/03/23(Thu) 13:17:42)
No101643 (魔界の仮面弁士 さん) に返信
レジストリにタブレットモードの値はありましたが、off になっていました。
>  HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\ImmersiveShell
> TabletMode (DWORD)
>  0 = Off
>  1 = On

> ConvertibleSlateModePromptPreference (DWORD)
見つかりませんでした。

Windows を初期化しても直らない。
困りました。



引用返信 編集キー/
■101648 / inTopicNo.6)  Re[5]: Windows11 で
□投稿者/ 河童 (41回)-(2023/03/23(Thu) 18:17:32)
フォームのMaximizeBox を「False」に設定すると最大化しなくなりました。

今度最大化したいときに困ることになるでしょうが、
今はこれで対応していきます。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -