关于窗口退出的几个问题
请教几个和窗口退出有关的疑问,都是在处理WM_CLOSE时:
1.调用DestroyWindow,按下关闭按钮为何窗口只是表面关闭,进程中还在,并且cpu占用很高.
2.调用PostQuitMessage,此时按叉无法退出,但移动一下窗口位置再按叉就可以退出.若选择系统菜单里的关闭则可以直接退出.
3.调用PostMessage,发送WM_DESTROY,则情况如问题2.
4.调用SendMessage,发送WM_DESTROY,则情况如问题2.
5.调用ExitProcess,窗口可以直接关闭,既然可以这样直接关闭窗口,那为何正常的窗口关闭过程要如书上说的如此繁琐呢?
6.调用PostMessage,发送WM_QUIT,则窗口可以正常关闭,疑问同5.
7.直接跳转到DefWindowProc,窗口无法真正关闭,进程中还在,并占用cpu很高.
代码如下:
.386
.model flat,stdcall
option casemap:none
include windows.inc
include kernel32.inc
includelib kernel32.lib
include user32.inc
includelib user32.lib
include gdi32.inc
includelib gdi32.lib
WinMain proto :dword,:dword,:dword,:dword
.data
szClassName db 'TestClose',0
szAppName db 'TestClose',0
.data?
hInstance dd ?
hWinMain dd ?
CommandLine dd ?
.code
start:
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke GetCommandLine
mov CommandLine,eax
invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWNORMAL
invoke ExitProcess,NULL
WinMain proc uses edi esi ebx,hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:dword,CmdShow:Dword
local wc:WNDCLASSEX
local msg:MSG
mov wc.cbSize,sizeof WNDCLASSEX
mov wc.style,CS_HREDRAW or CS_VREDRAW
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,NULL
mov wc.lpfnWndProc,offset WndProc
mov wc.lpszClassName,offset szClassName
mov wc.lpszMenuName,NULL
mov eax,hInstance
mov wc.hInstance,eax
invoke GetStockObject,WHITE_BRUSH
mov wc.hbrBackground,eax
invoke LoadIcon,NULL,IDI_APPLICATION
mov wc.hIcon,eax
mov wc.hIconSm,eax
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
invoke RegisterClassEx,addr wc
invoke CreateWindowEx,NULL,offset szClassName,offset szAppName,WS_OVERLAPPEDWINDOW,\
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,\
hInst,NULL
mov hWinMain,eax
invoke ShowWindow,hWinMain,CmdShow
invoke UpdateWindow,hWinMain
.while TRUE
invoke GetMessage,addr msg,hWinMain,NULL,NULL
.break .if eax==0
invoke TranslateMessage,addr msg
invoke DispatchMessage,addr msg
.endw
mov eax,msg.wParam
ret
WinMain endp
WndProc proc uses edi esi ebx,hWnd:HWND,uMsg:UINT,wParam:dword,lParam:dword
.if uMsg==WM_DESTROY
invoke PostQuitMessage,NULL
.elseif uMsg==WM_CLOSE
;invoke DestroyWindow,hWnd
;情况1
;窗口关闭后任务管理器中还在,cpu占用95%
;invoke PostQuitMessage,NULL
;情况2
;按叉无法退出,移动窗口后再按叉可退出
;选择系统菜单关闭可退出
;invoke PostMessage,hWnd,WM_DESTROY,NULL,NULL
;情况3
;按叉无法退出,移动窗口后再按叉可退出
;选择系统菜单关闭可退出
;invoke SendMessage,hWnd,WM_DESTROY,NULL,NULL
;情况4
;按叉无法退出,移动窗口后再按叉可退出
;选择系统菜单关闭可退出
;invoke ExitProcess,NULL
;情况5
;窗口可以正常关闭
;invoke PostMessage,hWnd,WM_QUIT,NULL,NULL
;情况6
;窗口可以正常关闭
;jmp _defwinproc
;情况7
;窗口关闭后任务管理器中还在,cpu占用95%
.else
_defwinproc:
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.endif
xor eax,eax
ret
WndProc endp
end start