5

Windows API から監視データを取得しようとしています。このGetSystemMetrics()コマンドは、間違った幅をピクセル単位で返します。MicrosoftのWebサイトによると、これは私がする必要があるためですSetProcessDPIAware()

つまり、理解できないアプリケーション マニフェストを作成できることが望ましいということです。

同様に低レベルの代替手段を探していたところ、複数のディスプレイ モニターの関数と構造体が見つかりました。HMONITOR必要な rect 構造にアクセスするにはパスする必要がありHMONITORますが、問題が発生しているのは取得です。

MonitorFromWindow(hwnd,MONITOR_DEFAULTTOPRIMARY)GetMonitorInfo()このコマンドは範囲外です - [私が必要HMONITORとしている] は何の問題も引き起こさない ので奇妙です。私はすでに持っていてwindows.h含まwindowsx.hれています。ライブラリがありませんか、それとも何が問題なのですか?

余談ですが、そちらを見てみると、使用するモニターをユーザーが調整できるようにするのもいいかもしれないということがわかりました。 カウントを返す必要がありますが、これらの数値をモニター固有の情報を取得するために必要なデータにSM_CMONITORS変換する方法を知りたいです。HMONITOR

::編集::

「コメント」機能では、要求されたコード クリップを配置するのに十分なスペースが提供されないため、ここに編集を入れています。

また、MinGWでGNU GCCを使用しています

#include <iostream>//using these libraries
#include <Windowsx.h>
#include <windows.h>

using namespace std;

int main()
{
    //should print screen width in pixels

    LPMONITORINFO target;
        //create a monitor info struct to store the data to
    HMONITOR Hmon = MonitorFromWindow(hwnd,MONITOR_DEFAULTTOPRIMARY);
        //create a handle to the main monitor
        //(should start at top left of screen with (0,0) as apposed to other monitors i believe)
        //if i could gather aditional info on what monitors are available that might be           useful
    GetMonitorInfo(Hmon, target);
        //Get the necessary data and store it to target

    cout << "bottom of selected monitor in pixels: " << target->rcMonitor.bottom
         << "Top of the selected monitor" << target->rcMonitor.top
         << "right extreme of selected monitor" << target->rcMonitor.right
         << "left extreme of selected monitor" << target->rcMonitor.left;

    return 0;
}
4

1 に答える 1

9

Windows 95/Windows NT 4 以降に登場した機能を使用する場合は、コンパイル前に WINVER を指定する必要があります。

Windows 2000 はであるため、定数を表示するにWINVER 0x0500はコンパイル行を追加する必要があります。-DWINVER=0x500MONITOR_DEFAULTTOPRIMARY

MONITORINFO構造体へのポインターではなく構造体を割り当てMONITORINFO、フィールドを初期化してcbSize、Windows が入力する情報を認識できるようにする必要があるため、コードでは次のようになります。

MONITORINFO target;
target.cbSize = sizeof(MONITORINFO);

HMONITOR hMon = MonitorFromWindow(GetDesktopWindow(), MONITOR_DEFAULTTOPRIMARY);
GetMonitorInfo(hMon, &target);

そして、次を使用して表示します。

 target.rcMonitor

それ以外の

target->rcMonitor

を使用SetProcessDPIAware()することは Windows Vista の機能であるため、WINVERに設定する必要があります0x0600が、MinGW に同梱されているヘッダーは、Windows Vista の完全なヘッダー セットではないようです。その関数定義はありませんが、Windows 7 には存在します。 SDK ヘッダー (チェックするための Windows Vista SDK が手元にありません)。

したがって、マニフェストを使用する方が、新しい API をプルするよりも簡単なソリューションのように思えます。

モニターハンドルは、モニターの不透明な表現であることを意図しています。つまり、取得した値は、他のモニター機能以外には使用しないでください。モニター構造をウォークする場合は、EnumDisplayMonitors関数と適切なコールバック ルーチンを使用する必要があります。

于 2013-02-02T00:14:20.097 に答える