• ベストアンサー

WM_QUERYENDSESSIONを使って次文で

#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が終了してしまいます 何が悪いのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.3

>case WM_QUERYENDSESSION: >のときも >case WM_CLOSE: >case WM_DESTROY: >の後の処理を行わせる事にしているのです なんで? PostQuitMessage(0); 呼び出すから終わっちゃうんですけど。 そもそもWM_CLOSEでPostQuitMessage()呼ぶのもおかしいんですけど。

keyguy
質問者

お礼

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

その他の回答 (3)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.4

>WM_QUERYENDSESSIONもWM_CLOSEもWM_DESTROYもWM_PAINTもみんな戻り値がおかしい。 この上の文章、なんか少し誤解されてるかも。 WM_PAINTもWM_CLOSEもWM_DESTROYもおかしいというのは、すべて常に0を返さないといけないからということです。 変数を使ってる時点で変です。 という意味で書いてます。LRESULTじゃないからということでは無いです。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

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?url=/library/en-us/sysinfo/base/wm_queryendsession.asp

keyguy
質問者

お礼

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

keyguy
質問者

補足

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

回答No.1

if(i==IDNO)b_logoff=false; の後、break も return もありませんけど、それでいいのですか?

keyguy
質問者

お礼

ありがとうございます 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; }

keyguy
質問者

補足

#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 int logoff; int i; 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) { 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; }

関連するQ&A