重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

#include <windows.h>

LRESULT CALLBACK WndProc(HWND hW,UINT ms,WPARAM wp,LPARAM lp)
{
HDC hD;
PAINTSTRUCT ps;
static int width=0,height=0;
static TCHAR strSize[128];
static boolean b_logoff;
int i;

switch(ms)
{
case WM_QUERYENDSESSION:
b_logoff=true;
i=MessageBox(hW,"end?","?",MB_YESNO|MB_TOPMOST);
if(i==IDNO)b_logoff=false;
case WM_CLOSE:
case WM_DESTROY:
PostQuitMessage(0);
return b_logoff;
case WM_SIZE:
width=LOWORD(lp);
height=HIWORD(lp);
return b_logoff;
case WM_PAINT:
hD=BeginPaint(hW,&ps);
wsprintf(strSize,"width = %d : height= %d",width,height);
TextOut(hD,10,10,strSize,lstrlen(strSize));
EndPaint(hW,&ps);
return b_logoff;
}
return DefWindowProc(hW,ms,wp,lp);
}

ユーザがWindowsを終了させようとしたときに
ウォーンング用の警告ボックスを表示したのですが
Noボタンを押してもWindowsが終了してしまいます
何が悪いのでしょうか?

A 回答 (4件)

>case WM_QUERYENDSESSION:


>のときも
>case WM_CLOSE:
>case WM_DESTROY:
>の後の処理を行わせる事にしているのです

なんで?
PostQuitMessage(0);
呼び出すから終わっちゃうんですけど。
そもそもWM_CLOSEでPostQuitMessage()呼ぶのもおかしいんですけど。
    • good
    • 0
この回答へのお礼

ありがとうございます
PostQuitMessage(0);
を使ったのはこれを使ってもメインウィンドウが壊されるとは限らないと書いていたからです
試行錯誤で何とかやってみます

お礼日時:2004/09/28 03:00

>WM_QUERYENDSESSIONもWM_CLOSEもWM_DESTROYもWM_PAINTもみんな戻り値がおかしい。



この上の文章、なんか少し誤解されてるかも。


WM_PAINTもWM_CLOSEもWM_DESTROYもおかしいというのは、すべて常に0を返さないといけないからということです。
変数を使ってる時点で変です。

という意味で書いてます。LRESULTじゃないからということでは無いです。
    • good
    • 0

WM_QUERYENDSESSIONもWM_CLOSEもWM_DESTROYもWM_PAINTもみんな戻り値がおかしい。


WM_QUERYENDSESSIONに対する処理は#1の方のとおりに構造がおかしい。

そもそもFALSEとfalseは別物だしウィンドウプロシージャの戻り値はLRESULT。boolじゃないし。

で、一番の原因はWM_QUERYENDSESSION中のメッセージボックスで「いいえ」を押されたときにプロシージャの戻り値でFALSEを返してないこと。

http://msdn.microsoft.com/library/default.asp?ur …

この回答への補足

ありがとうございます

No.1の補足に
1行抜けていたので追加しておきました
これでも論理的におかしいのでしょうか?

補足日時:2004/09/27 17:33
    • good
    • 0
この回答へのお礼

falseをFALSEにtrueをTRUEにかえてやってみましたが結果は同じでした
何かいい方法は無いでしょうか?

お礼日時:2004/09/27 17:42

if(i==IDNO)b_logoff=false;



の後、break も return もありませんけど、それでいいのですか?

この回答への補足

#include <windows.h>

LRESULT CALLBACK WndProc(HWND hW,UINT ms,WPARAM wp,LPARAM lp)
{
HDChD;
PAINTSTRUCTps;
static intwidth=0,height=0;
static TCHARstrSize[128];
static intlogoff;
inti;

logoff=0;
switch(ms)
{
case WM_QUERYENDSESSION:
logoff=1;;
i=MessageBox(hW,"end?","?",MB_YESNO|MB_TOPMOST);
if(i==IDNO)logoff=0;
case WM_CLOSE:
case WM_DESTROY:
PostQuitMessage(0);
return logoff;
case WM_SIZE:
width=LOWORD(lp);
height=HIWORD(lp);
return logoff;
case WM_PAINT:
hD=BeginPaint(hW,&ps);
wsprintf(strSize,"width = %d : height= %d",width,height);
TextOut(hD,10,10,strSize,lstrlen(strSize));
EndPaint(hW,&ps);
return logoff;
}
return DefWindowProc(hW,ms,wp,lp);
}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE,PSTR,int)
{
HWNDhW;
MSGms;
WNDCLASSwinc;

winc.style=CS_HREDRAW | CS_VREDRAW;
winc.lpfnWndProc=WndProc;
winc.cbClsExtra=winc.cbWndExtra=0;
winc.hInstance=hInstance;
winc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
winc.hCursor=LoadCursor(NULL,IDC_ARROW);
winc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
winc.lpszMenuName=NULL;
winc.lpszClassName=TEXT("KITTY");

if(!RegisterClass(&winc))return -1;

hW=CreateWindow
(
TEXT("KITTY"),TEXT("end test"),
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,hInstance,NULL
);

if(hW==NULL)return -1;

while(GetMessage(&ms,NULL,0,0))DispatchMessage(&ms);
return ms.wParam;
}

補足日時:2004/09/27 18:21
    • good
    • 0
この回答へのお礼

ありがとうございます
case WM_QUERYENDSESSION:
のときも
case WM_CLOSE:
case WM_DESTROY:
の後の処理を行わせる事にしているのです

一行抜けていました
あわせてWinMainも付けてみます

LRESULT CALLBACK WndProc(HWND hW,UINT ms,WPARAM wp,LPARAM lp)
{
HDC hD;
PAINTSTRUCT ps;
static int width=0,height=0;
static TCHAR strSize[128];
static boolean b_logoff;
int i;

b_logoff=false;
switch(ms)
{
case WM_QUERYENDSESSION:
b_logoff=true;
i=MessageBox(hW,"end?","?",MB_YESNO|MB_TOPMOST);
if(i==IDNO)b_logoff=false;
case WM_CLOSE:
case WM_DESTROY:
PostQuitMessage(0);
return b_logoff;
case WM_SIZE:
width=LOWORD(lp);
height=HIWORD(lp);
return b_logoff;
case WM_PAINT:
hD=BeginPaint(hW,&ps);
wsprintf(strSize,"width = %d : height= %d",width,height);
TextOut(hD,10,10,strSize,lstrlen(strSize));
EndPaint(hW,&ps);
return b_logoff;
}
return DefWindowProc(hW,ms,wp,lp);
}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE,PSTR,int)
{
HWND hW;
MSG ms;
WNDCLASS winc;

winc.style=CS_HREDRAW | CS_VREDRAW;
winc.lpfnWndProc=WndProc;
winc.cbClsExtra=winc.cbWndExtra=0;
winc.hInstance=hInstance;
winc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
winc.hCursor=LoadCursor(NULL,IDC_ARROW);
winc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
winc.lpszMenuName=NULL;
winc.lpszClassName=TEXT("KITTY");

if(!RegisterClass(&winc))return -1;

hW=CreateWindow
(
TEXT("KITTY"),TEXT("end test"),
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,hInstance,NULL
);

if(hW==NULL)return -1;

while(GetMessage(&ms,NULL,0,0))DispatchMessage(&ms);
return ms.wParam;
}

お礼日時:2004/09/27 17:28

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!