こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

win32apiにおける終了処理について

下記のプログラムを実行してウィンドウを閉じるボタンで閉じると、
ウィンドウは消えるのですがなぜかプロセスが残ってしまいます。

正直、お手上げなので教えて頂けると幸いです。
よろしくお願いします。

#include<windows.h>

#define APP_NAME TEXT("Sample_MainWindow")

/*ウィンドウプロシージャ*/
LRESULT CALLBACK WindowProc(
HWND hWnd, UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
switch(uMsg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}

/*基本的なメッセージの処理*/
return DefWindowProc(hWnd, uMsg,wParam,lParam);

}

/*WinMain*/
int WINAPI WinMain(
HINSTANCE hInstance ,
HINSTANCE hPrevInstance ,
PSTR lpCmdLine ,
int nCmdShow)
{
HWND hWnd;
WNDCLASS wc;
MSG msg;

wc.style= CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc= DefWindowProc;
wc.cbClsExtra= 0;
wc.cbWndExtra= 0;
wc.hInstance= hInstance;
wc.hIcon= LoadIcon(NULL,IDI_APPLICATION);
wc.hCursor= LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground= (HBRUSH)COLOR_BACKGROUND + 1;
wc.lpszMenuName= NULL;
wc.lpszClassName= APP_NAME;

if (!RegisterClass(&wc)){
MessageBox(NULL,TEXT("ウィンドウクラスの作成に失敗しました"),NULL,MB_OK);
return 0;
}

hWnd = CreateWindow(
APP_NAME, TEXT("Window Title"),
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL
);

if(hWnd == NULL){
MessageBox(NULL,TEXT("ウィンドウの生成に失敗しました"),NULL,MB_OK);
return 0;
}

/*メッセージループ*/
while(GetMessage(&msg, NULL,0,0)){
DispatchMessage(&msg);
}

return (int)msg.wParam;
}

投稿日時 - 2014-11-29 17:59:19

QNo.8841440

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

7人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

Wr5

まぁ、私もそういうメッセージループ書いたような気がしますけども……

http://msdn.microsoft.com/ja-jp/library/cc364699.aspx
より……
>警告 GetMessage 関数は、0 以外の値、0、-1 のいずれかを返します。したがって、次のようなコードは避けてください。
>while (GetMessage(lpMsg, hWnd, 0, 0)) ...
>このようなコードを作成すると、GetMessage 関数が失敗して -1(0xFFFFFFFF、つまり TRUE)が返った場合、ループが持続し、致命的なアプリケーションエラーを発生させる可能性があります。

とのことなので…GetMessage()がなにを返却しているか確認してみてはどうですかね?


って、見直してたら…このウィンドウプロシージャ、使われていないじゃないですか。
WM_DESTROYもDefWindowProc()が処理しているので…WM_QUITが飛んでこないんじゃないかと。
>wc.lpfnWndProc= DefWindowProc;
で自前のウィンドウプロシージャ使わん!と設定していますし。

投稿日時 - 2014-11-29 18:57:37

お礼

遅くなりましたが、お陰様で解決しました。
ありがとうございました。

投稿日時 - 2015-01-29 08:01:45

ANo.1

wc.lpfnWndProc= DefWindowProc;
これを
wc.lpfnWndProc= WindowProc;
にしてみたらどうかな?

投稿日時 - 2014-11-29 18:57:17

お礼

遅くなりましたが、お陰様で解決しました。
ありがとうございました。

投稿日時 - 2015-01-29 09:01:28

あなたにオススメの質問