Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winapi 窗口';s关闭按钮,can';你不能让它按我想的那样工作吗?_Winapi_Assembly_Masm32 - Fatal编程技术网

Winapi 窗口';s关闭按钮,can';你不能让它按我想的那样工作吗?

Winapi 窗口';s关闭按钮,can';你不能让它按我想的那样工作吗?,winapi,assembly,masm32,Winapi,Assembly,Masm32,我已经面临这个问题有一段时间了,我想在单击关闭按钮时发布一个消息框,询问用户是否要关闭程序。我的自定义退出按钮就像一个符咒,但窗口的关闭按钮(X)不是这样。 当我单击“是”时,它会完美地退出程序,但当单击“否”时,它只会关闭窗口,但程序仍在运行,每次都必须从任务管理器关闭它 必须提到的是,就在单击(X)按钮时,程序立即关闭主窗口并提示消息框(是/否)。 我只是想让它工作,所以当我点击“否”时,它将返回到主程序。 代码如下: .386P .MODEL FLAT, stdcall include

我已经面临这个问题有一段时间了,我想在单击关闭按钮时发布一个消息框,询问用户是否要关闭程序。我的自定义退出按钮就像一个符咒,但窗口的关闭按钮(X)不是这样。 当我单击“是”时,它会完美地退出程序,但当单击“否”时,它只会关闭窗口,但程序仍在运行,每次都必须从任务管理器关闭它

必须提到的是,就在单击(X)按钮时,程序立即关闭主窗口并提示消息框(是/否)。 我只是想让它工作,所以当我点击“否”时,它将返回到主程序。 代码如下:

.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