none
ClickOnceアプリケーションの高DPI対応方法について RRS feed

  • 質問

  • ClickOnceでプログラムを配布するWindows FormアプリケーションのWindows10対応を行っています。

    対応作業中のプログラムは画像描画処理を伴うため、高DPI対応の設定をapplication.manifestに設定したいのですが、

    ClickOnce用のマニフェストファイルとバッティングするのか、dpiAware=Trueの属性を既存のapplication.manifestに

    追加するとプログラムのダウンロードエラーが発生します。

    このエラーを回避する方法をご教授ください。なお、インストーラによる高DPI設定のアプリケーションとしては動作できることを確認しています。

    エラー内容:

     「システムに接続されたデバイスが機能していません。 (HRESULT からの例外:0x8007001F)」

    開発環境:

     Windows7、Viusal Studio 2015 Professional

    2016年10月3日 2:41

回答

  • すみません。検証を行っていないのですが、マニフェストに高DPI対応を明記する方法ではなく、
    コードで高DPI対応を宣言することもできるようです。ウィンドウを作成する前、コードの初めに
    SetProcessDPIAwareやSetProcessDpiAwarenessを呼び出す方法です。

    [System.Runtime.InteropServices.DllImport("user32.dll")]
    private static extern bool SetProcessDPIAware();
    
    [STAThread]
    static void Main()
    {    
        if (Environment.OSVersion.Version.Major >= 6) SetProcessDPIAware();
    
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        ...

    あるいは、Windows 8.1 以降では、SetProcessDpiAwarenessを使ったほうが良い?

    [System.Runtime.InteropServices.DllImport("SHCore.dll")]
    private static extern bool SetProcessDpiAwareness(PROCESS_DPI_AWARENESS awareness);
    
    private enum PROCESS_DPI_AWARENESS
    {
        Process_DPI_Unaware = 0,
        Process_System_DPI_Aware = 1,
        Process_Per_Monitor_DPI_Aware = 2
    }
    ...
    // ウィンドウを作成する前に呼び出す
    SetProcessDpiAwareness(PROCESS_DPI_AWARENESS.Process_System_DPI_Aware);
    
    ...

    参考サイト:

    http://stackoverflow.com/questions/8864672/installing-clickonce-published-dpi-aware-application

    • 回答としてマーク 広い空 2016年10月4日 1:03
    • 編集済み kenjinoteMVP 2016年10月4日 2:51
    2016年10月3日 6:55

すべての返信

  • 回答ではありませんが、この現象、当方の環境でも確認できてます。

    Windows 10 Insider Preview・Visual Studio 2015・.NET Framework 4.5・WPFとForms の混合アプリケーション

    上記アプリケーションのマニフェストを編集し ClickOnce で Surface Pro 4 に配布を試みると、同様の現象が発生します。 

      <!-- このコメントアウトを解除するとインストール時エラーが発生する。.NET Framework 4 の時は手作業でマニフェスト編集していたがダウト!
      <application xmlns="urn:schemas-microsoft-com:asm.v3">
        <windowsSettings>
          <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
        </windowsSettings>
      </application>
      -->

    ネット上に掲載されてる記事を参考に application.manifest の編集を散々試みましたが、悉く質問者さんと同じエラーが発生したためマニフェストの編集を断念し、全画面 WPF 化に移行する方向に切り替えました。

    解決の参考にはならないと思いますが、一応参考まで。。。


    本フォーラムは、ユーザー(開発者)同士で情報交換を行うためのコミュニティです。初めて利用される方は、以下のアナウンスをご覧ください。 https://social.msdn.microsoft.com/Forums/ja-JP/ca9ecfb7-4407-4fcb-b8bd-207d68257e68?


    2016年10月3日 4:15
    モデレータ
  • すみません。検証を行っていないのですが、マニフェストに高DPI対応を明記する方法ではなく、
    コードで高DPI対応を宣言することもできるようです。ウィンドウを作成する前、コードの初めに
    SetProcessDPIAwareやSetProcessDpiAwarenessを呼び出す方法です。

    [System.Runtime.InteropServices.DllImport("user32.dll")]
    private static extern bool SetProcessDPIAware();
    
    [STAThread]
    static void Main()
    {    
        if (Environment.OSVersion.Version.Major >= 6) SetProcessDPIAware();
    
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        ...

    あるいは、Windows 8.1 以降では、SetProcessDpiAwarenessを使ったほうが良い?

    [System.Runtime.InteropServices.DllImport("SHCore.dll")]
    private static extern bool SetProcessDpiAwareness(PROCESS_DPI_AWARENESS awareness);
    
    private enum PROCESS_DPI_AWARENESS
    {
        Process_DPI_Unaware = 0,
        Process_System_DPI_Aware = 1,
        Process_Per_Monitor_DPI_Aware = 2
    }
    ...
    // ウィンドウを作成する前に呼び出す
    SetProcessDpiAwareness(PROCESS_DPI_AWARENESS.Process_System_DPI_Aware);
    
    ...

    参考サイト:

    http://stackoverflow.com/questions/8864672/installing-clickonce-published-dpi-aware-application

    • 回答としてマーク 広い空 2016年10月4日 1:03
    • 編集済み kenjinoteMVP 2016年10月4日 2:51
    2016年10月3日 6:55
  • APIならmanifestファイルの競合は出なさそうなので、さっそく試してみます。

    確認次第結果報告いたします。ありがとうございました。

    2016年10月3日 23:46
  • 現在のアプリはWindows7もターゲットのため、

    アドバイスしていただいたAPIのうちSetProcessDPIAware()を試してみました。

    この方法でClickOnceのアプリが150DPI表示でも目的通りの描画処理が維持できることを確認しました。

    ありがとうございました。

    2016年10月4日 1:03