19548


Windows10を使用しており、デスクトップのカスタマイズで、  
『テキスト、アプリ、その他の項目のサイズを変更する』で倍率を上げています。

その状態で、Screen.Primry.Boundsでサイズを取得し、BmpクラスのSaveで  
画面全体をキャプチャするコードを書いているのですが、保存された画像を  
見てみると、実際の画面イメージより小さく、下と右が途切れてしまいます。

タイトルでは、ディスプレイのカスタマイズが原因かと思い込んで質問していますが、  
ひょっとしたら他に原因があるのかもしれませんが、原因と対策をお教えください。

# 以下が、実際のソースです。

[code]

        private void captureFullScreen()
        {
            //Bitmapの作成
            Bitmap bmp = new Bitmap(Screen.PrimaryScreen.Bounds.Width,
                Screen.PrimaryScreen.Bounds.Height);
            //Graphicsの作成
            Graphics g = Graphics.FromImage(bmp);
            //画面全体をコピーする
            g.CopyFromScreen(new Point(0, 0), new Point(0, 0), bmp.Size);
            //解放
            g.Dispose();
    
    
            bmp.Save(this.path + @"\scr" + this.iCaptureCount + ".jpg", ImageFormat.Jpeg);
        }
    
[/code]

[![Windows10側の設定画面](https://i.stack.imgur.com/T7CWi.jpg)](https://i.stack.imgur.com/T7CWi.jpg)

何卒よろしくお願いいたします。


CC BY-SA 3.0
2015-12-02T05:25:35.103
19544
2015-12-02T07:56:53.410
2015-12-02T07:56:53.410
4236
9374
question
c# windows
ディスプレイのカスタマイズでサイズの倍率を変更すると、スクリーンサイズが正しく取得できない


> タイトルでは、ディスプレイのカスタマイズが原因かと思い込んで質問していますが、  
>  ひょっとしたら他に原因があるのかもしれませんが、原因と対策をお教えください。

そのとおりですが、一口には説明できませんので、とりあえずは下記URLを読んでみてください。  
<https://msdn.microsoft.com/en-us/library/dn469266(v=vs.85).aspx>  
その他、「High DPI」「per monitor dpi」で検索するのも良いです。

どうしたいのかによりますが、manifestを付けると解決できるかも知れません。  
こちらは「manifest dpiAware」で検索してみてください。


CC BY-SA 3.0
2015-12-02T06:51:20.077
19547
2015-12-02T06:51:20.077
13487
19544
answer


Windowsには以前より[High DPI機能](https://msdn.microsoft.com/en-
us/library/dn469266\(v=vs.85\).aspx#high_dpi_features_in_windows)が提供されています。この中でも特にWindows
Vistaから提供されている **DPI仮想化機能** が影響しています。High
DPIに未対応のアプリケーションの場合、Windows側で自動的に拡大するもので、その分、アプリケーションに対しては仮想化された小さな座標系のように振る舞います。これによってスクリーンの右下が切れてしまったのでしょう。

対策ですが、もちろんHigh
DPI機能に対応することです。具体的な手順としては、プロジェクトに対して新規項目の追加でアプリケーションマニフェストを追加します。（その際、自動的にプロジェクトのプロパティのマニフェストの項に`app.manifest`が設定されます。）  
追加された`app.manifest`ファイルには

[code]

    <application xmlns="urn:schemas-microsoft-com:asm.v3">
      <windowsSettings>
        <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
      </windowsSettings>
    </application>
    
[/code]

の項目がコメントアウトされた形で書かれているはずですので、コメントを外すことで有効化してください。

古いVisual Studioでは一部の機能が提供されていませんので、その場合は、上記手順に相当するマニフェストを設定してください。


CC BY-SA 3.0
2015-12-02T07:20:18.687
19548
2015-12-02T07:20:18.687
4236
19544
answer