主题:处理WM_CLOSE时调用DestroyWindow无法关闭窗口
为什么在处理处理WM_CLOSE时调用DestroyWindow无法真正关闭窗口呢?点关闭后,窗口时消失了,但是进程还在,而且占用很高的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 'CloseWindow',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
.else
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.endif
xor eax,eax
ret
WndProc endp
end start
.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 'CloseWindow',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
.else
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.endif
xor eax,eax
ret
WndProc endp
end start