Home > Tags > Programming TIPS

Programming TIPS

気まぐれ Programming TIPS 【3】

【3】 マルチディスプレイ制御(C)

気まぐれに思いついた内容を、私個人としては備忘録的に殴り書いたりしたいという思いはある。

今回はマルチディスプレイ制御について。
PCに複数のディスプレイが接続されているときに、それらを制御する方法です。

●ディスプレイの情報を取得する
まず、接続されているディスプレイの情報を取得しなければならない。
ディスプレイ情報の取得にはEnumDisplayMonitors関数を使用する。
EnumDisplayMonitors関数は指定されたクリッピング領域とデバイスコンテキストの可視領域が交差して形成される領域と重なる部分のあるディスプレイモニタを列挙します。by MSDN

BOOL EnumDisplayMonitors (
HDC hdc, // ディスプレイデバイスコンテキストのハンドル
LPCRECT lprcClip, // クリッピング領域を指定
MONITORENUMPROC lpfnEnum, // コールバック関数へのポインタ
LPARAM dwData // コールバック関数に渡すデータ
);
なにやら取得するディスプレイの条件を指定できるようだが、今回はすべてのディスプレイを取得したいので、第1、第2引数をNULLにする。
第3引数は見つけたディスプレイに対し1度ずつ呼ばれるコールバック関数へのポインタ。第4引数はその関数へ渡すデータである。

コールバック関数の宣言はこんな感じ、
bool CALLBACK MonitorProc(HMONITOR hMonitor,HDC hdc,LPRECT lprcMonitor,LPARAM dwData);

次は、各ディスプレイの情報を取得する。
取得にはGetMonitorInfo関数を使用する。

BOOL GetMonitorInfo(
HMONITOR hMonitor, // ディスプレイモニタのハンドル
LPMONITORINFO lpmi // ディスプレイモニタの情報へのポインタ
);
取得できる情報は下記構造体。

typedef struct tagMONITORINFO
{
DWORD cbSize; //構造体のサイズ
RECT rcMonitor; //ディスプレイ矩形のRECT構造体
RECT rcWork; //ディスプレイの有効面を表すRECT構造体
DWORD dwFlags; //ディスプレイのフラグ
} MONITORINFO, *LPMONITORINFO;
RECTのデータは仮想ディスプレイのもの。
複数のディスプレイが接続されていると、仮想的に1つのでかいディスプレイとして扱われるらしい。その中での位置とサイズ。

GetMonitorInfo関数で情報を取得するにはディスプレイのハンドルが必要である。
上記コールバック関数は各ディスプレイのハンドルを与えてくれるので、コールバック関数の中で、情報を取得する。

bool CALLBACK MonitorProc(HMONITOR hMonitor,HDC hdc,LPRECT lprcMonitor,LPARAM dwData)
{
    MONITORINFO mi;
   
    //MONITORINFO構造体のサイズを指定してやる.お約束 .これやらないとうまくいかない.
    mi.cbSize = sizeof(MONITORINFO);   

    GetMonitorInfo(hMonitor,&mi); 

    printf("monitor size %d * %d\n",mi.rcMonitor.right - mi.rcMonitor.left,mi.rcMonitor.bottom - mi.rcMonitor.top);
}

すべてのディスプレイについて上記コールバック関数が呼ばれるので、取得したMONITORINFOをどこかに記録しておけばあとで利用できる。
例えば、各ディスプレイにウィンドウを表示したい場合、MONITORINFOから仮想ディスプレイの座標がわかるのでその位置にMoveWindowなりしてやればよい。

文責:T.Sato

  • Comments (Close): 0
  • Trackbacks (Close): 0

気まぐれ Programming TIPS 【2】

【2】 現在時刻の取得(C)

気まぐれに思いついた内容を、備忘録的に殴り書くものでございます。

今回は現在時刻を取得する方法について。
現在時刻を取得するには、標準Cライブラリのtime関数を使います。

time_t time(time_t *time);

引数timeは時刻の格納場所へのポインタ。
戻り値は1970年1月1日0時以降の経過秒数。

time関数で取得できるシステム時刻は、経過秒数なのでわかりやすい形に変換する。

struct tm *localtime(const time_t time);

tm構造体のメンバは以下の通り、
tm_sec – 秒(0~59)
tm_min – 分(0~59)
tm_hour – 時間(0~23)
tm_mday – 日(1~31)
tm_mon – 月(0~11、1月=0)
tm_year – 年(実際の西暦から1900を引いた数)
tm_wday – 曜日(0~6、日曜日=0)
tm_yday – 年内の通産日(0~365、1月1日=0)
tm_isdst – 夏時間が有効な場合は正の値、夏時間が無効な場合は0、夏時間がどうかが不明な場合は負の値

time関数で取得したtime_t変数をlocaltime関数に渡すと、
タイムゾーンに合わせてtm構造体に変換される。

以下サンプルコード

  char week[7][3] = {"日","月","火","水","木","金","土"};  time_t time_now; struct tm  *local;  time(&time_now); local = localtime(&time_now);  printf("%d年%02d月%02d日(%s)\n",local->tm_year+1900,local->tm_mon+1,local->tm_mday,week[local->tm_wday]); printf("%02d時%02d分%02d秒\n", local->tm_hour, local->tm_min, local->tm_sec);  

実行結果
2009年08月17日(月)
14時02分15秒

  • Comments (Close): 0
  • Trackbacks (Close): 0

Home > Tags > Programming TIPS

Search
Feeds
Meta

Return to page top