2016-03-21 30 views
4

Windows C++アプリケーションで実際の画面解像度(ピクセル単位)を取得しようとしています。 Windowsのdpi設定が変更されると、実際の解像度の代わりに仮想(調整)解像度が得られます。私は、SetProcessDPIAware、SetProcessDpiAwareness(引数として3つの列挙値すべてを使用)とマニフェストの真の設定を使用しようとしました。すべての3つのケースでは、Windows 7のPCではコードが正常に動作します(実際の解像度が表示されます)が、Win 10では表示されません(ここではDPI認識設定は無視され、調整された解像度が返されます)。SetProcessDPIAwareがWindows 10で動作しないようです。

#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers 

// Windows Header Files: 
#include <windows.h> 
#include <winuser.h> 
#include <VersionHelpers.h> 
#include <ShellScalingAPI.h> 
#include <stdlib.h> 
#include <stdio.h> 

int APIENTRY WinMain(HINSTANCE hInstance, 
        HINSTANCE hPrevInstance, 
        LPSTR  lpCmdLine, 
        int  nCmdShow) 
{ 
char *cBuffer2 ; 

    cBuffer2 = (char *)malloc(3000) ; 
    if (IsWindowsVistaOrGreater()) 
    { 
// SetProcessDpiAwareness(PROCESS_SYSTEM_DPI_AWARE); 
     int result = SetProcessDPIAware(); 

     sprintf(cBuffer2,"SetProcessDPIAware() result: [%i]\n",result) ; 

     int height = GetSystemMetrics(SM_CYSCREEN); 
     int width = GetSystemMetrics(SM_CXSCREEN); 
     sprintf(cBuffer2,"%s#1:\nHeight: [%i]\nwidth: [%i]\n",cBuffer2,height,width) ; 


     HWND hwnd = (HWND)atoi(lpCmdLine) ; 
     HMONITOR monitor = MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST); 
     MONITORINFO info; 
     info.cbSize = sizeof(MONITORINFO); 
     GetMonitorInfo(monitor, &info); 
     int monitor_width = info.rcMonitor.right - info.rcMonitor.left; 
     int monitor_height = info.rcMonitor.bottom - info.rcMonitor.top; 
     sprintf(cBuffer2,"%s#2:\nHeight: [%i]\nwidth: [%i]\n",cBuffer2,monitor_height,monitor_width) ; 

    } 

    MessageBox(0,cBuffer2,"SHOWRES.EXE",MB_OK) ; 
    return 0 ; 
} 

私が使用してみましたマニフェストは、次のいずれかです。

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" > 
    <asmv3:application> 
    <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings"> 
     <dpiAware>true</dpiAware> 
    </asmv3:windowsSettings> 
    </asmv3:application> 
</assembly> 

任意のアイデア?

+2

あなたがここで何をしたのかは分かりません。あなたは同時にすべてのことをしているようです。なぜあなたはそれを選んでそれに固執しないのですか?マニフェストアプローチを使用することをお勧めします。あなたは、その成果が何であるか教えてくれませんでした。 –

+0

@David Heffernan:はい、私は多くの異なるアプローチを試していません。私は元のポストでは、Windows 7の下で私は期待される結果(すなわち、ディスプレイの実際の解像度)を得るが、ウィンドウ10では、解像度(私はDPI対応の設定がなくても同じです)。 –

+1

問題は、どのアプローチが必要なのか、何を試したのかわかりません。あなたが1つのアプローチを選択し、[mcve]を提示することをお勧めします。 –

答えて

4

Jonathan PotterとBarmak Shemiraniの助けを借りて、最終的に何が起こっているのかを知ることができました.Windows 10は、Windowsの以前のバージョンとは異なり、ユーザーはログをとる必要なしにdpi設定を '再度ログインしてください。私は通常、標準(100%)の設定を持つwinマシン10でテストを実行していました。だから私は150%に設定を変更し、アプリを実行し、間違った結果を得るだろう。

ジョナサンとBarmakの回答は、特定のPCの設定には何かがあり、プログラムではなく、一般的に10勝することが問題を引き起こしていることを示しています。だから私は次のように試しました:

そして私は正しい結果(実際の画面解像度、調整されたもの)を得ました。

SetProcessDPIAware(および関連するアプローチ:SetProcessDpiAwareness()とtrueを指定したマニフェスト)を正しく動作させるには、DPI設定を変更してからプログラムを実行する前にログアウトして再度ログインする必要があります。

もう一度、ジョナサンとバーマックありがとう!

+0

これは役に立ちませんが、SetProcessDpiAware()のドキュメントでは、それ以降のバージョンのWindowsでは(その関数のMSDNの要件セクションに従って)SetProcessDpiAwareness()を*代わりに使用する必要があります(*マニフェストかコードかにかかわらず、一度呼び出される必要があります)。 –

関連する問題