关于窗口退出的几个问题

Tomorrow0 2008-07-13 08:38:30
请教几个和窗口退出有关的疑问,都是在处理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

...全文
121 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
alan001 2008-07-30
  • 打赏
  • 举报
回复
UP
Tomorrow0 2008-07-29
  • 打赏
  • 举报
回复
非常感谢楼上的,问题解决了.
原来是GetMessage第2个参数要用NULL才行.
但是为什么此参数不能用hWinMain呢?
需要获取的就是本窗口的消息啊,怎么用本窗口句柄也不行呢?
一剑 2008-07-25
  • 打赏
  • 举报
回复
把你的这段代码:

.while TRUE
invoke GetMessage,addr msg,hWinMain,NULL,NULL
.break .if eax==0
invoke TranslateMessage,addr msg
invoke DispatchMessage,addr msg
.endw


换成如下这段代码再试试捏:

.while TRUE
invoke GetMessage, addr msg, NULL, 0, 0
.break .if eax == 0
invoke TranslateMessage, addr msg
invoke DispatchMessage, addr msg
.endw

Tomorrow0 2008-07-23
  • 打赏
  • 举报
回复
楼上的仁兄,可以说的详细点吗,我不太明白你的意思哦
alan001 2008-07-20
  • 打赏
  • 举报
回复
不响应WM_SIZE消息,会占用CPU资源哦
Tomorrow0 2008-07-16
  • 打赏
  • 举报
回复
哪为何调用PostQuitMessage,会按叉叉无法退出,但是移动窗口位置后再按叉就可以退出呢?
cnzdgs 2008-07-13
  • 打赏
  • 举报
回复
DestroyWindow用于销毁窗口;PostQuitMessage就是用PostMessage发WM_QUIT消息,用于退出消息循环;WM_DESTROY消息是DestroyWindow中发出的,最好不要自己发这个消息;ExitProcess是直接退出进程,如果在任务管理器中结束进程,对于简单的程序可能没有问题,对于复杂一些的程序,这样推出可能会造成程序数据(文件)不完整,程序异常等情况;处理各种消息最后都要调用DefWindowProc,个别特殊的消息除外。

21,453

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧