- ベストアンサー
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が終了してしまいます 何が悪いのでしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>case WM_QUERYENDSESSION: >のときも >case WM_CLOSE: >case WM_DESTROY: >の後の処理を行わせる事にしているのです なんで? PostQuitMessage(0); 呼び出すから終わっちゃうんですけど。 そもそもWM_CLOSEでPostQuitMessage()呼ぶのもおかしいんですけど。
その他の回答 (3)
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>WM_QUERYENDSESSIONもWM_CLOSEもWM_DESTROYもWM_PAINTもみんな戻り値がおかしい。 この上の文章、なんか少し誤解されてるかも。 WM_PAINTもWM_CLOSEもWM_DESTROYもおかしいというのは、すべて常に0を返さないといけないからということです。 変数を使ってる時点で変です。 という意味で書いてます。LRESULTじゃないからということでは無いです。
- taka_tetsu
- ベストアンサー率65% (1020/1553)
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
お礼
falseをFALSEにtrueをTRUEにかえてやってみましたが結果は同じでした 何かいい方法は無いでしょうか?
補足
ありがとうございます No.1の補足に 1行抜けていたので追加しておきました これでも論理的におかしいのでしょうか?
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
if(i==IDNO)b_logoff=false; の後、break も return もありませんけど、それでいいのですか?
お礼
ありがとうございます 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; }
補足
#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; }
お礼
ありがとうございます PostQuitMessage(0); を使ったのはこれを使ってもメインウィンドウが壊されるとは限らないと書いていたからです 試行錯誤で何とかやってみます