2006年06月09日

マルチモニタAPIの使い方

環境
Visual C++.NET 2003

Windowsにおいて、GetMonitorInfoやMonitorFromPointなどのマルチモニタAPIを使用するときによく発生するエラーと、その対処法を紹介します。

スクリーン上の座標x,yが属するモニタの情報を取得するため、以下のようなコードを書いたとします。

POINT Point = {x, y};
MONITORINFO MonitorInfo;
HMONITOR MonitorHandle = ::MonitorFromPoint(Point, MONITOR_DEFAULTTOPRIMARY);
MonitorInfo.cbSize = sizeof(MonitorInfo);
::GetMonitorInfo(MonitorHandle, &MonitorInfo);

特に変哲のない普通にコードですが、これだけのコードでもコンパイルエラーやリンクエラーに悩まされます。

最初に出会うのがこのコンパイルエラーです。

error C2065: 'MONITORINFO' : 定義されていない識別子です。

MOINTERINFOの説明(MSDN)を読むと、windows.hをインクルードするだけで良い様に思えますが、 どうやらmultimon.hというヘッダファイルをインクルードする必要があるようです。

次に出会うのがこのリンクエラーです。

LNK2019: 未解決の外部シンボル _xGetMonitorInfo@8 が関数 "XXX" (YYY) で参照されました。

これを回避するためには、以下のコードを何れか一つのソースファイルに書いておく必要があるようです。

#define COMPILE_MULTIMON_STUBS
#include <multimon.h>

これでようやく最初のコードが動きます。簡単なようで、大変ですね。

なお、後者のリンクエラーの方は、場合によっては出ないようです。どのような場合か特定できていませんが、もしかしたらMFCを使うとエラーがでなくなるのかもしれません。

投稿者 MASATO : 2006年06月09日 00:21 | トラックバック
コメント
コメントする









名前、アドレスを登録しますか?