PeekMessage()関数


BOOL PeekMessage(
 LPMSG lpMsg,
 HWND hWnd,
 UINT wMsgFilterMin,
 UINT wMsgFilterMax,
 UINT wRemoveMsg
);


lpMsgメッセージを取得するMSG構造体へのポインタ
hWndメッセージを取得するウィンドウへのハンドル
wMsgFilterMin取得するメッセージの最小値。両方0にするとフィルタリングしない。
wMsgFilterMax取得するメッセージの最大値。両方0にするとフィルタリングしない。
wRemoveMsgPM_REMOVE メッセージをキューから削除する
PM_NOREMOVE メッセージをキューから削除しない。

メッセージを取得した時は、0以外の値が返ります。
メッセージを取得しなかった時は、0が返ります。

GetMessage関数と違い、PeekMessage関数は、キュー内にメッセージが置かれるまで待つことはありません。


while (1) {
 if ( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) ) {
  // メッセージがある場合はそれを処理する
  if ( msg.message == WM_QUIT ) break;
  DispatchMessage( &msg );
 } else {
  // アイドル時の処理を行う
 }
}

Windows > メッセージループ | comments (0) | trackbacks (0)

パフォーマンスカウンタ


BOOL QueryPerformanceFrequency(
 LARGE_INTEGER *lpFrequency
);

高分解能パフォーマンスカウンタの周波数を取得します。
パフォーマンスカウンタをサポートしていない時は、0が返ります。

lpFrequencyカウンタの周波数(カウント毎秒)を受け取る64ビット整数へのポインタ


BOOL QueryPerformanceCounter(
 LARGE_INTEGER *lpPerformanceCount
);

高分解能パフォーマンスカウンタの現在値を取得します。

lpPerformanceCount現在のカウントを受け取る64ビット整数へのポインタ

このタイマは、すべてのマシンで利用できるわけではありません。
また、現在製造されているすべてのプロセッサでサポートされていますが、
古いプロセッサの中にはサポートしないものもあります。
このため、プログラムではこのタイマが存在するかどうかをテストし、
利用できない場合はtimeGetTime()を使うようにしなければなりません。


#define UPDATE_TICKS_MS 100

_int64 start, end, freq, update_ticks_pc
MSG msg;

if ( !QueryPerformanceFrequency( ( LARGE_INTEGER* )&freq ) )
 return -1;

update_ticks_pc = UPDATE_TICKS_MS * freq / 1000;

QueryPerformanceCounter( ( LARGE_INTEGER* )&start );

while ( GetMessage( &msg, NULL, 0, 0 ) ) {
 TranslateMessage( &msg );
 DispatchMessage( &msg );
 QueryPerformanceCounter( ( LARGE_INTEGER* )&end );
 while ( ( end - start ) >= update_ticks_pc ) {
  UpdateWorld();
  start += update_ticks_pc;
 }
}

 return msg.wParam;


あまり良いサンプルじゃない。
Windows > メッセージループ | comments (0) | trackbacks (0)

GetMessage()関数


BOOL GetMessage(
 LPMSG lpMsg,
 HWND hWnd,
 UINT wMsgFilterMin,
 UINT wMsgFilterMax
);

メッセージキューからメッセージを取得する

lpMsglpMsgに指定したMSG構造体にhWndのメッセージを抽出する
hWndウインドウを特定せず、すべてのメッセージを受け取る場合はNULLを指定
wMsgFilterMin
wMsgFilterMax
取得するメッセージを特定の範囲に限定したい場合に利用するフィルタ
通常は、すべてのメッセージを処理する必要があるので0を指定する

一般的な使用例

while ( GetMessage( &msg, NULL, 0, 0 ) ) {
 TranslateMessage( &msg );
 DispatchMessage( &msg );
}


・GetMessage()関数は処理するメッセージが発生するまで制御を返しません。
・TranslateMessageは、一部のメッセージをプログラムで扱いやすいように変換するAPIです。
・DispatchMessageは、MSG構造体のhwndメンバーを参照して、そのウィンドウ・プロシージャを呼び出すようにWindowsに依頼します。
Windows > メッセージループ | comments (0) | trackbacks (0)