質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

1回答

2436閲覧

プライマリモニターより左上のモニターでフォームの挙動がおかしい

kalbon

総合スコア12

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

1グッド

0クリップ

投稿2021/05/04 13:52

編集2021/05/05 06:18

前提・実現したいこと

マルチモニター環境にて、プライマリモニターより左上のモニターでフォームのどの位置にマウスカーソルがあってもサイズ変更ができてしまう。Windowsの不具合の可能性があるが、これを回避したい

発生している問題・エラーメッセージ

(1)c#で2つのフォームを作り、Form1のボタンを押したらForm2が表示されるようにする。
(2)スクリーン座標でX,Y共に負となる座標にForm2を移動する。
(3)クリックすると、Form2のエッジではなくどこでもサイズ変更になる。

該当のソースコード

c#

1namespace WindowsFormsApp1 2{ 3 public partial class Form1 : Form 4 { 5 public Form1() 6 { 7 InitializeComponent(); 8 } 9 10 private void button1_Click(object sender, EventArgs e) 11 { 12 13 Form2 f2 = new Form2(); 14 f2.ShowDialog(); 15 16 } 17 } 18}

c#

1namespace WindowsFormsApp1 2{ 3 public partial class Form2 : Form 4 { 5 public Form2() 6 { 7 InitializeComponent(); 8 } 9 } 10}

試したこと

ShowDialogではなくShowでは再現しませんでした。
また、スクリーン座標X,Yのいずれが正の場合は発生しません。
.net framework 4.8でビルドしても再現しました。
再現率100%です。

補足情報(FW/ツールのバージョンなど)

Windows 10 20H2
Visual c# 2017
.net framework 4.5

###追記
マウスの左ボタンを押しっぱなしにすると、ウインドウの端ではなくウインドウの中でもサイズ変更ができてしまいます。左ボタンを押さなくともマウスカーソルも左上と右下も両側カーソルになりますし、明らかにおかしいです。プライマリモニタでは問題ありません。また、セカンダリモニタをプライマリの右や下としても問題ありません。座標がX,Yとも負の状況はめずらしいのでしょうか。簡単に再現できると思います。ちなみにspy++で確認したところ、ウインドウ右下の端でもないにもかかわらずWM_NCHITEESTはHTBOTTOMRIGHTとなります

###追記2
別のPCで試したところ、同じく100%再現しました。Win10 1903です。

退会済みユーザー👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2021/05/04 14:22 編集

不具合、バグなどではなく、Windowsの仕様の様な。一般的にはマルチモニターの際は、右側プラス方向に増やします。別の環境でそうはならないのであれば、不具合の可能性はありますが。あるいはビデオドライバーのせいとか。
kalbon

2021/05/04 15:48

状況を追記いたしました。
guest

回答1

0

ベストアンサー

どうも Framework のバグっぽいですね。

Form.WmNCHitTest
https://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/Form.cs,62d04e8f1c6326d2

WM_NCHITEEST をフォームが受け取るとここにくるんですが、x,y の求め方がマイナス方向を考慮していません。

int x = NativeMethods.Util.LOWORD(m.LParam);
int y = NativeMethods.Util.HIWORD(m.LParam);

この2つは

int x = NativeMethods.Util.SignedLOWORD(m.LParam);
int y = NativeMethods.Util.SignedHIWORD(m.LParam);

でなければおかしいです。

回避するには、マウスの位置を正しく取得して、正しい値を返すようにすればよいと思います。

投稿2021/05/05 18:57

KOZ6.0

総合スコア2707

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KOZ6.0

2021/05/06 02:28

おお、本当だ。 もうちょっと待てば反映されるかもしれませんね。
退会済みユーザー

退会済みユーザー

2021/05/06 02:57 編集

.NET5辺りでは反映されているかもしれませんね。(確認はしてません) 質問者の方がFramework4.5を変えれない場合は、いずれにしても何らかの回避策を入れるしかなさそうですが。(4.5は既にサポート期限が切れているバージョンなので、使用はオススメできないですが…)
kalbon

2021/05/07 10:10

ありがとうございます。ただ残念ながらWM_NCHITTESTをOVERRIDEしてSignedLOWORD、SignedHIWORDにしても状況は変わりませんでした。base.WndProc中身そのものがおかしいようです。それではとWM_NCHITTESTで自前でウインドウの端を実装しましたが、今度はフォーム内に貼ってあるコントロールにウインドウサイズの変更が伝搬せず。困りました。
kalbon

2021/05/07 11:05

すみません、上記はわたしの勘違いでResizeも反映できていました。クローズとさせてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問