Winapi 窗口';s关闭按钮,can';你不能让它按我想的那样工作吗?
我已经面临这个问题有一段时间了,我想在单击关闭按钮时发布一个消息框,询问用户是否要关闭程序。我的自定义退出按钮就像一个符咒,但窗口的关闭按钮(X)不是这样。 当我单击“是”时,它会完美地退出程序,但当单击“否”时,它只会关闭窗口,但程序仍在运行,每次都必须从任务管理器关闭它 必须提到的是,就在单击(X)按钮时,程序立即关闭主窗口并提示消息框(是/否)。 我只是想让它工作,所以当我点击“否”时,它将返回到主程序。 代码如下:Winapi 窗口';s关闭按钮,can';你不能让它按我想的那样工作吗?,winapi,assembly,masm32,Winapi,Assembly,Masm32,我已经面临这个问题有一段时间了,我想在单击关闭按钮时发布一个消息框,询问用户是否要关闭程序。我的自定义退出按钮就像一个符咒,但窗口的关闭按钮(X)不是这样。 当我单击“是”时,它会完美地退出程序,但当单击“否”时,它只会关闭窗口,但程序仍在运行,每次都必须从任务管理器关闭它 必须提到的是,就在单击(X)按钮时,程序立即关闭主窗口并提示消息框(是/否)。 我只是想让它工作,所以当我点击“否”时,它将返回到主程序。 代码如下: .386P .MODEL FLAT, stdcall include
.386P
.MODEL FLAT, stdcall
include c:\masm32\include\user32.inc
includelib c:\masm32\lib\user32.lib
include c:\masm32\include\kernel32.inc
includelib c:\masm32\lib\kernel32.lib
includelib c:\masm32\lib\masm32.lib
include MYedit.inc
atodw PROTO :DWORD
;------------------------------------------------------------
_DATA SEGMENT DWORD PUBLIC USE32 'DATA'
NEWHWND DD 0
MSG MSGSTRUCT <?>
WC WNDCLASS <?>
HINST DD 0
TITLENAME DB 'Calculator',0
CLASSNAME DB 'CLASS32',0
CPBUT DB 'Exit',0
CPBUT2 DB 'Calculate',0
CPEDT1 DB 'Decimal Number (Max 9 Digits):',0
CPEDT2 DB 'New Counting Base (1-36):',0
CPEDT3 DB 'Result:',0
CPEDT4 DB 0
CLSBUTN DB 'BUTTON',0
CLSEDIT DB 'EDIT',0
HWNDBTN DWORD 0
HWNDEDT1 DWORD 0
HWNDBTN2 DWORD 0
HWNDEDT2 DWORD 0
HWNDEDT3 DWORD 0
HWNDEDT4 DWORD 0
HWNDEDT5 DWORD 0
HWNDEDT6 DWORD 0
CAP DB 'Exit',0
MES DB 'Are you sure to exit the program ?',0
NStr DB 9 dup(0),0
CBasStr DB 3 DUP(0),0
CBas DB ?,0
TheResult BYTE 31 DUP (0),0
_DATA ENDS
;----------------------------------------
_TEXT SEGMENT DWORD PUBLIC USE32 'CODE'
START:
INVOKE GetModuleHandleA, 0
MOV [HINST], EAX
REG_CLASS:
MOV [WC.CLSSTYLE], STYLE
MOV [WC.CLWNDPROC], OFFSET WNDPROC
MOV [WC.CLSCBCLSEX],0
MOV [WC.CLSCBWNDEX],0
MOV EAX, [HINST]
MOV [WC.CLSHINST], EAX
INVOKE LoadIconA, 0, IDI_APPLICATION
MOV [WC.CLSHICON], EAX
INVOKE LoadCursorA, 0, IDC_ARROW
MOV [WC.CLSHCURSOR], EAX
MOV [WC.CLBKGROUND], 5
MOV DWORD PTR [WC.CLMENNAME], 0
MOV DWORD PTR [WC.CLNAME], OFFSET CLASSNAME
INVOKE RegisterClassA, ADDR WC
INVOKE CreateWindowExA, 0, OFFSET CLASSNAME, OFFSET TITLENAME, WS_OVERLAPPEDWINDOW-WS_SIZEBOX-WS_MAXIMIZEBOX-WS_CAPTION, 100, 100, 500, 160, 0, 0, [HINST], 0
CMP EAX, 0
JZ _ERR
MOV [NEWHWND], EAX
INVOKE ShowWindow, [NEWHWND], SW_SHOWNORMAL
;------------------------------------------------------------
INVOKE UpdateWindow, [NEWHWND]
MSG_LOOP:
INVOKE GetMessageA, OFFSET MSG, 0, 0, 0
CMP EAX, 0
JE END_LOOP
INVOKE TranslateMessage, OFFSET MSG
INVOKE DispatchMessageA, OFFSET MSG
JMP MSG_LOOP
END_LOOP:
INVOKE ExitProcess, [MSG.MSWPARAM]
_ERR:
JMP END_LOOP
; The Order of Parameters in The Stack
; [EBP+014Í] ; LPARAM
; [EBP+10H] ; WAPARAM
; [EBP+0CH] ; MES
; [EBP+8] ; HWND
WNDPROC PROC
PUSH EBP
MOV EBP,ESP
PUSH EBX
PUSH ESI
PUSH EDI
CMP DWORD PTR [EBP+0CH] ,WM_DESTROY
JE WMDESTROY
CMP DWORD PTR [EBP+0CH] ,WM_CREATE
JE WMCREATE
CMP DWORD PTR [EBP+0CH] ,WM_COMMAND
JE WMCOMMND
JMP DEFWNDPROC
WMCOMMND:
MOV EAX,HWNDBTN
CMP DWORD PTR [EBP+14H],EAX
JE WMDESTROY
MOV EAX,HWNDBTN2
CMP DWORD PTR [EBP+14H],EAX
JE BTNCOPY
MOV EAX, 0
JMP FINISH
;====================================
BTNCOPY:
INVOKE SendMessageA, HWNDEDT4, WM_GETTEXT, 10, OFFSET NStr
INVOKE SendMessageA, HWNDEDT5, WM_GETTEXT, 3, OFFSET CBasStr
CALL Calculate
INVOKE SendMessageA, HWNDEDT6, WM_SETTEXT, 0, OFFSET TheResult
MOV EAX, 0
JMP FINISH
WMCREATE:
;=============The Exit Button
INVOKE CreateWindowExA, 0, OFFSET CLSBUTN, OFFSET CPBUT, STYLBTN, 372, 50, 100, 20, DWORD PTR [EBP+08H], 0, [HINST],0
MOV HWNDBTN,EAX
;=============The Calculate Button
INVOKE CreateWindowExA, 0, OFFSET CLSBUTN, OFFSET CPBUT2, STYLBTN, 372, 10, 100, 20, DWORD PTR [EBP+08H], 0, [HINST],0
MOV HWNDBTN2,EAX
;=============================================
;1st =====================
INVOKE CreateWindowExA, WS_EX_RIGHT, OFFSET CLSEDIT, OFFSET CPEDT1, STYLEDT1, 10, 10, 210, 23, DWORD PTR [EBP+08H], 0, [HINST],0
MOV HWNDEDT1,EAX
;2nd =====================
INVOKE CreateWindowExA, WS_EX_RIGHT, OFFSET CLSEDIT, OFFSET CPEDT2, STYLEDT1, 10, 50, 210, 23, DWORD PTR [EBP+08H], 0, [HINST],0
MOV HWNDEDT2,EAX
;3rd =====================
INVOKE CreateWindowExA, WS_EX_RIGHT, OFFSET CLSEDIT, OFFSET CPEDT3, STYLEDT1, 10, 90, 210, 23, DWORD PTR [EBP+08H], 0, [HINST],0
MOV HWNDEDT3,EAX
;4th =====================
INVOKE CreateWindowExA, WS_EX_CLIENTEDGE, OFFSET CLSEDIT, OFFSET CPEDT4, STYLEDT2, 225, 10, 83, 20, DWORD PTR [EBP+08H], 0, [HINST],0
MOV HWNDEDT4,EAx
;5th =====================
INVOKE CreateWindowExA, WS_EX_CLIENTEDGE, OFFSET CLSEDIT, OFFSET CPEDT4, STYLEDT2, 225, 50, 27, 20, DWORD PTR [EBP+08H], 0, [HINST],0
MOV HWNDEDT5,EAX
;6th =====================
INVOKE CreateWindowExA, WS_EX_CLIENTEDGE, OFFSET CLSEDIT, OFFSET CPEDT4, STYLEDT2, 225, 90, 249, 20, DWORD PTR [EBP+08H], 0, [HINST],0
MOV HWNDEDT6,EAX
;=================================
INVOKE SetFocus, HWNDEDT4
MOV EAX, 0
JMP FINISH
DEFWNDPROC:
INVOKE DefWindowProcA, DWORD PTR [EBP+08H], DWORD PTR [EBP+0CH], DWORD PTR [EBP+10H], DWORD PTR [EBP+14H]
JMP FINISH
WMDESTROY:
INVOKE MessageBoxA, DWORD PTR [EBP+08H], OFFSET MES, OFFSET CAP, 4
.IF EAX==6
INVOKE PostQuitMessage, 0
MOV EAX,0
.ELSE
JMP FINISH
.ENDIF
FINISH:
POP EDI
POP ESI
POP EBX
POP EBP
RET 16
WNDPROC ENDP
.386P
.平板模型,标准球
包括c:\masm32\include\user32.inc
includelib c:\masm32\lib\user32.lib
包含c:\masm32\include\kernel32.inc
includelib c:\masm32\lib\kernel32.lib
includelib c:\masm32\lib\masm32.lib
包括MYedit.inc
atodw原型:DWORD
;------------------------------------------------------------
_数据段DWORD公用32“数据”
新罕布什尔州DD 0
MSGSTRUCT
WC WNDCLASS
HINST DD 0
标题名称数据库“计算器”,0
CLASSNAME数据库'CLASS32',0
CPDB“退出”,0
CPBUT2 DB“计算”,0
CPEDT1 DB“十进制数(最多9位):”,0
CPEDT2 DB“新计数基数(1-36):”,0
CPEDT3数据库“结果:”,0
CPEDT4数据库0
CLSBUTN数据库“按钮”,0
CLSEDIT数据库“编辑”,0
HWNDBTN DWORD 0
HWNDEDT1 DWORD 0
HWNDBTN2双字0
HWNDEDT2 DWORD 0
HWNDEDT3 DWORD 0
HWNDEDT4 DWORD 0
HWNDEDT5 DWORD 0
HWNDEDT6 DWORD 0
CAP DB“退出”,0
MES DB“您确定要退出该程序吗?”,0
NStr数据库9重复(0),0
CBasStr数据库3重复(0),0
CBas数据库?,0
结果字节31 DUP(0),0
_数据端
;----------------------------------------
_文本段DWORD公用32“代码”
开始:
调用GetModuleHandleA,0
MOV[HINST],EAX
注册课程:
MOV[WC.CLSSTYLE],风格
移动[WC.CLWNDPROC],偏移WNDPROC
MOV[WC.CLSCBCLSEX],0
MOV[WC.CLSCBWNDEX],0
MOV EAX,[HINST]
MOV[WC.CLSHINST],EAX
调用LoadIconA,0,IDI_应用程序
MOV[WC.CLSHICON],EAX
调用LoadCursorA,0,IDC_箭头
MOV[WC.CLSHCURSOR],EAX
MOV[WC.CLBK接地],5
MOV DWORD PTR[WC.CLMENNAME],0
MOV DWORD PTR[WC.CLNAME],偏移类名称
调用RegisterClassA,ADDR WC
调用CreateWindowExA,0,偏移类名,偏移标题名,WS_OVERLAPPEDWINDOW-WS_SIZEBOX-WS_MAXIMIZEBOX-WS_标题,100100500160,0,0,[HINST],0
CMP-EAX,0
JZ_ERR
MOV[NEWHWND],EAX
调用ShowWindow[NEWHWND],SW_SHOWNORMAL
;------------------------------------------------------------
调用UpdateWindow[NEWHWND]
MSG_循环:
调用GetMessageA,偏移量消息,0,0,0
CMP-EAX,0
端环
调用TranslateMessage,偏移量消息
调用DispatchMessageA,偏移量消息
JMP MSG_循环
结束循环:
调用ExitProcess,[MSG.MSWPARAM]
_错误:
JMP端环
; 堆栈中参数的顺序
; [EBP+014Í];LPARAM
; [EBP+10H];瓦帕拉姆
; [EBP+0CH];MES
; [EBP+8];HWND
WNDPROC程序
推EBP
电动汽车
推EBX
推动ESI
推式电子数据交换
CMP DWORD PTR[EBP+0CH],WM\U销毁
毁灭
CMP DWORD PTR[EBP+0CH],WM_创建
JE WMCREATE
CMP DWORD PTR[EBP+0CH],WM_命令
JE WMCOMMND
JMP DEFWNDPROC
WMCOMMND:
MOV-EAX,HWNDBTN
CMP DWORD PTR[EBP+14H],EAX
毁灭
MOV-EAX,HWNDBTN2
CMP DWORD PTR[EBP+14H],EAX
日本广播公司
MOV-EAX,0
JMP整理
;====================================
BTNCOPY:
调用sendmagesa、HWNDEDT4、WM_GETTEXT、10、偏移量NStr
调用sendmagesa,HWNDEDT5,WM_GETTEXT,3,OFFSET CBasStr
呼叫计算
调用sendmagesa、HWNDEDT6、WM_SETTEXT、0、偏移结果
MOV-EAX,0
JMP整理
创建:
;=============退出按钮
调用CreateWindowExA,0,偏移量CLSBUTN,偏移量CPBUT,STYLBTN,372,50,100,20,DWORD PTR[EBP+08H],0,[HINST],0
MOV HWNDBTN,EAX
;=============计算按钮
调用CreateWindowExA,0,偏移量CLSBUTN,偏移量CPBUT2,STYLBTN,372,10,100,20,DWORD PTR[EBP+08H],0,[HINST],0
MOV HWNDBTN2,EAX
;=============================================
;第一=====================
调用CreateWindowExA,WS_EX_RIGHT,OFFSET CLSEDIT,OFFSET CPEDT1,STYLEDT1,10,10,210,23,DWORD PTR[EBP+08H],0,[HINST],0
MOV HWNDEDT1,EAX
;第二=====================
调用CreateWindowExA,WS_EX_RIGHT,OFFSET CLSEDIT,OFFSET CPEDT2,STYLEDT1,10,50,210,23,DWORD PTR[EBP+08H],0,[HINST],0
MOV HWNDEDT2,EAX
;第三=====================
调用CreateWindowExA,WS_EX_RIGHT,OFFSET CLSEDIT,OFFSET CPEDT3,STYLEDT1,10,90,210,23,DWORD PTR[EBP+08H],0,[HINST],0
MOV HWNDEDT3,EAX
;第四=====================
调用CreateWindowExA、WS_EX_CLIENTEDGE、OFFSET CLSEDIT、OFFSET CPEDT4、STYLEDT2、225、10、83、20、DWORD PTR[EBP+08H],0、[HINST],0
MOV HWNDEDT4,EAx
;第五=====================
调用CreateWindowExA、WS_EX_CLIENTEDGE、OFFSET CLSEDIT、OFFSET CPEDT4、STYLEDT2