SetProcessDpiAwarenessは効果がありません

ルネサッカー

ClickOnceアプリケーションでDPI認識を無効にしようとしています。
ClickOnceはマニフェストファイルでasm.v3をサポートしていないため、マニフェストで指定することはできません。

私が見つけた次のオプションは、新しいWindows関数SetProcessDpiAwarenessを呼び出すことでした

このチュートリアルによると

アプリケーションウィンドウを作成する前に、SetProcessDpiAwarenessを呼び出します。

そしてこのチュートリアル、

Win32APIを呼び出す前に、SetProcessDpiAwarenessを呼び出す必要があります

かなり早い段階で関数を呼び出す必要があります。したがって、テストするために、完全に空白のWPFアプリケーションを作成し、これをAppクラス全体にしました。

[DllImport("SHCore.dll", SetLastError = true)]
private static extern bool SetProcessDpiAwareness(PROCESS_DPI_AWARENESS awareness);

[DllImport("SHCore.dll", SetLastError = true)]
private static extern void GetProcessDpiAwareness(IntPtr hprocess, out PROCESS_DPI_AWARENESS awareness);

private enum PROCESS_DPI_AWARENESS
{
    Process_DPI_Unaware = 0,
    Process_System_DPI_Aware = 1,
    Process_Per_Monitor_DPI_Aware = 2
}

static App()
{
    var result = SetProcessDpiAwareness(PROCESS_DPI_AWARENESS.Process_DPI_Unaware);
    var setDpiError = Marshal.GetLastWin32Error();
    MessageBox.Show("Dpi set: " + result.ToString());

    PROCESS_DPI_AWARENESS awareness;
    GetProcessDpiAwareness(Process.GetCurrentProcess().Handle, out awareness);
    var getDpiError = Marshal.GetLastWin32Error();
    MessageBox.Show(awareness.ToString());

    MessageBox.Show("Set DPI error: " + new Win32Exception(setDpiError).ToString());
    MessageBox.Show("Get DPI error: " + new Win32Exception(getDpiError).ToString());
}

3つのメッセージボックスにこのコンテンツが表示されます。

Dpiセット:True
Process_System_DPI_Aware
セットDPIエラー:System.ComponentModel.Win32Exception(0x80004005):アクセスが拒否されました
System.ComponentModel.Win32Exception(0x80004005):操作は正常に完了しました

アプリケーションがまだDPI_Awareに設定されているのはなぜですか?この電話は十分に早くありませんか?
アプリケーションは確かにDPIスケーリングを経験します。

マニフェスト定義を使用する場合:

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

Process_DPI_Unawareを返します。

編集1:
pInvokeメソッドの直後にMarshal.GetLastWin32Error()を取得するようになりました。これにより、実際にエラーが返されるようになりました。

aybe

注意してくださいSetLastErrorGetLastWin32Errorなどの間のいずれかの呼び出しは、MessageBox.Showその結果に影響を与えます。ネイティブメソッドを呼び出した直後に、必ず最後のエラーが発生するようにしてください。

したがって、期待どおりの動作が得られているのに、エラーコードに惑わされている可能性があります。

完全な説明については、このブログ投稿を参照してください:http//blogs.msdn.com/b/oldnewthing/archive/2015/08/19/10636096.aspx

編集

アクセスが拒否された原因についてはよくわかりませんが、DPIの認識を無効にする簡単で効果的なトリックがあります。

AssemblyInfo.cs編集し、以下を追加します。

[assembly: DisableDpiAwareness]

ソース:https//code.msdn.microsoft.com/windowsdesktop/Per-Monitor-Aware-WPF-e43cde33(PerMonitorAwareWPFWindow.xaml.csのコメント)

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

TOP 一覧

  1. 1

    Unity:未知のスクリプトをGameObject(カスタムエディター)に動的にアタッチする方法

  2. 2

    セレンのモデルダイアログからテキストを抽出するにはどうすればよいですか?

  3. 3

    Ansibleで複数行のシェルスクリプトを実行する方法

  4. 4

    tkinterウィンドウを閉じてもPythonプログラムが終了しない

  5. 5

    Crashlytics:コンパイラー生成とはどういう意味ですか?

  6. 6

    GoDaddyでのCKEditorとKCfinderの画像プレビュー

  7. 7

    Windows 10 Pro 1709を1803、1809、または1903に更新しますか?

  8. 8

    Chromeウェブアプリのウェブビューの高さの問題

  9. 9

    モーダルダイアログを自動的に閉じる-サーバーコードが完了したら、Googleスプレッドシートのダイアログを閉じます

  10. 10

    Windows 10の起動時間:以前は20秒でしたが、現在は6〜8倍になっています

  11. 11

    Reactでclsxを使用する方法

  12. 12

    ファイル内の2つのマーカー間のテキストを、別のファイルのテキストのセクションに置き換えるにはどうすればよいですか?

  13. 13

    MLでのデータ前処理の背後にある直感

  14. 14

    グラフからテーブルに条件付き書式を適用するにはどうすればよいですか?

  15. 15

    Pythonを使用して同じ列の同じ値の間の時差を取得する方法

  16. 16

    mutate_allとifelseを組み合わせるにはどうすればよいですか

  17. 17

    ネットワークグラフで、ネットワークコンポーネントにカーソルを合わせたときに、それらを強調表示するにはどうすればよいですか?

  18. 18

    テキストフィールドの値に基づいて UIslider を移動します

  19. 19

    BLOBストレージからデータを読み取り、Azure関数アプリを使用してデータにアクセスする方法

  20. 20

    PowerShellの分割ファイルへのヘッダーの追加

  21. 21

    ソートされた検索、ターゲット値未満の数をカウント

ホットタグ

アーカイブ