システムwiki

「アプリのスケーリングの修正」をオフにすると、アプリの動作が中断されます(.netフレームワークの画像操作が中断されます)...回避策はありますか?

TCCDeve 受付中 最終更新日:2020-09-27 12:35

ユーザーが[アプリのスケーリングを修正]をオフに設定すると、Windowsが本質的にすべてのアプリをDPI非対応として扱うことを修正しますか?

もしそうなら、アプリに「とにかくDPI対応として扱う」と言う方法はありますか? (これが最も簡単な回避策です.)

背景:WinFormsアプリは.NET Framework 4.5.1をターゲットとし、起動時にSetProcessDPIAware()を呼び出します.これにより、「モニターごと」ではなく「システム」を認識します.アプリはメタファイル(EMF +)を作成し、それを
データベースとWinForms PictureBoxコントロールに表示します.そのコードは何年もの間うまく機能しています.

ただし、Windows 101903および.NET Framework 4.8では、ユーザーが「アプリの固定スケーリング」をオフに設定し、スケーリングを150%以上にすると、UIが少しだけではありません100%と言ってから、独自のスケーリングを行うことで、あいまいになり、メタファイルも破壊されます
画像処理を構築します.特に、それはGraphics.DrawImageによって描画されたものを150%拡大するようです...または結果の寸法を150%縮小します...わかりません...しかし、結果はメタファイルに描画されている画像ですトリミングされます.
これは画面に表示されているものだけではありません...メモリで計算してSQL Serverデータベースに保存している画像が誤ってトリミングされています.

フレームサイズを事前に指定するために「新しいメタファイル」への呼び出しを変更すると、バグが回避されます.残念ながら、結果のサイズはわかりません...進行中、イメージを構築し続けます.そのため、通常は四角形を指定せず、サイズを自動調整します
メタファイルに描画するコンテンツに.(「アプリのスケーリングを修正」をオフにできるようになったため、スケーリング係数によってオフになっています.)

回避策の質問#2:「アプリのスケーリングを修正」をオフにしてもトリミングされないサイズを指定せずにメタファイルを作成できる方法はありますか?

回避策#3:「アプリのスケーリングの修正」がオフになっていることを検出して、誤動作することをユーザーに警告できるようにする方法はありますか?オンに戻す必要があることをユーザーに警告します?

予想どおり、スケーリングを150%以上に設定して[アプリのスケーリングを修正]をオフにしない限り、計算されたメタファイルは元の画像の左上部分のみになります.これがコードスニペットです...

DPI対応に設定するメインプログラム:

静的
クラス
プログラム

{
[System.Runtime.InteropServices.DllImport( "user32.dll")]
プライベート静的extern bool SetProcessDPIAware();
///<概要>
///Applicationのメインエントリポイント.
///
[STAThread]
static void Main()
{
//if(Environment.OSVersion.Version.Major>= 6)
SetProcessDPIAware();
Application.EnableVisualStyles();
Application.SetcompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}

}

オフスクリーンデバイスコンテキストを含み、内容に合わせて事前計算された境界がない新しいメタファイルを作成するための呼び出し:

公開
静的
メタファイル
NewMetafile()

{
使用(グラフィックスg=Graphics.FromHwnd(IntPtr.Zero)) //オフスクリーンデバイスコンテキスト
{
IntPtr hdc=g.GetHdc();//gを使用して呼び出されたg.Dispose()によって解放されます
新しいMetafile(hdc、EmfType.EmfPlusOnly);を返します.
}

}

ボタンクリックの実装、画像を新しいメタファイルにコピー:

プライベート
ボイド
DrawUsingMetafile()

{
試す
{
画像img=this.pictureBox1.Image;
メタファイルmf=NewMetafile();
使用(グラフィックスgmf=Graphics.FromImage(mf))
{
gmf.DrawImage(img、0、0、img.Width、img.Height);
}
this.pictureBox2.Image=mf;
}
キャッチ(例外例)
{
MessageBox.Show(ex.Message、 "Exception"、MessageBoxButtons.OK、MessageBoxIcon.Error);

}

}

この一貫性のないWindowsの動作に対する推奨される回避策があれば、高く評価されます.

返信リスト(回答:2)

1 #
DaveM12
こんにちはTCC
コミュニティはあなたの質問の範囲のために単なる消費者フォーラムです(WinForms Coding)あなたはC#WinformsセクションのMSDN(開発者ネットワーク)でこの質問を投稿してください(下記)
その上には、ホストのWinFormsプログラマーにアクセスできるようになり、この質問に対する知識のある素早い答えが得られます...
https://social.msdn.microsoft.com/forums/ja-JP/...