Windowsアプリケーション
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2020/11/20 15:23 UTC 版)
「イベントループ」の記事における「Windowsアプリケーション」の解説
Windowsにてユーザーとやりとりするプロセスを動作させる場合、イベントに応答するためのメッセージループが必須である。Windowsではイベントとメッセージは同等視される。イベントとしては、ユーザーとのやりとり、ネットワークのトラフィック、システム処理、タイマー、プロセス間通信などがある。対話型でないI/Oのみのイベントについては、I/O完了ポート(英語版)がある。I/O完了ポートのループはメッセージループとは別に動作し、メッセージループと相互作用することがない。 大抵のWin32アプリケーションの「心臓部」はWinMain()関数であり、ループ内でGetMessage()を呼び出す。GetMessage()はメッセージまたは「イベント」を受信するまでブロックする。何らかの選択的処理の後DispatchMessage()を呼び出し、対応するハンドラー用のコールバック関数 (ウィンドウプロシージャ: WindowProc) にメッセージをディスパッチする。専用のウィンドウプロシージャのないメッセージはDefWindowProc()というデフォルトのハンドラーにディスパッチする。RegisterClass()でウィンドウクラスを登録する際にウィンドウプロシージャの関数ポインタを指定することができ、DispatchMessage()はメッセージの送信先ウィンドウハンドル (HWND) に対応するウィンドウプロシージャを呼び出す。 以下はMicrosoft Docs (旧MSDNライブラリ) に記載されている、メッセージループの実装例のひとつである: MSG msg;BOOL bRet;while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0){ if (bRet == -1) { // handle the error and possibly exit } else { TranslateMessage(&msg); DispatchMessage(&msg); }} そのほか、ブロッキングせずにメッセージキューからメッセージを読み取るPeekMessage()を使う方法もある。
※この「Windowsアプリケーション」の解説は、「イベントループ」の解説の一部です。
「Windowsアプリケーション」を含む「イベントループ」の記事については、「イベントループ」の概要を参照ください。
- Windowsアプリケーションのページへのリンク