⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clock.asm

📁 用汇编语言编的闹钟程序
💻 ASM
📖 第 1 页 / 共 5 页
字号:
;********************************************************************
;	“启用闹钟功能”开启
;********************************************************************
_EnableAlarm	proc

		invoke	_CheckItem,CHK_ALARM,1
		invoke	_EnableItem,CHK_ONCE,TRUE
		invoke	_EnableItem,ALM_WAV1,TRUE
		invoke	_EnableItem,ALM_WAV2,TRUE
		invoke	_EnableItem,ALM_PLAY1,TRUE
		invoke	_EnableItem,ALM_PLAY2,TRUE
		invoke	_EnableItem,ALM_FILE,TRUE
		invoke	_EnableItem,ALM_BROWSE,TRUE
		invoke	_EnableItem,ALM_TIME,TRUE
		invoke	_EnableItem,ALM_FROMNOW,TRUE
		invoke	_EnableItem,ALM_MSG,TRUE
		invoke	_EnableItem,ALM_SHUTDOWN,TRUE
		invoke	_EnableItem,ALM_HOUR1,TRUE
		invoke	_EnableItem,ALM_MIN1,TRUE
		invoke	_EnableItem,ALM_HOUR2,TRUE
		invoke	_EnableItem,ALM_MIN2,TRUE
		invoke	_EnableItem,ALM_MESSAGE,TRUE
		ret

_EnableAlarm	endp
;********************************************************************
;	设置对话框初始化
;********************************************************************
_InitSetupDialog	proc

;*************** 取标志到临时位置 ***********************************
		mov	eax,dwFlag
;		mov	ebx,001003f0h
;		and	eax,ebx
;		not	ebx
;		and	dwTempFlag,ebx
;		or	dwTempFlag,eax
		mov	dwTempFlag,eax

		mov	eax,dwAlarmHour
		mov	dwHour1,eax
		mov	eax,dwAlarmMinute
		mov	dwMinute1,eax
;*************** 计算时间 *******************************************
		invoke	_TimeSub,dwAlarmHour,dwAlarmMinute
		mov	dwHour2,eax
		mov	dwMinute2,edx
;*************** 从注册表取出文本信息 *******************************
		mov	szBuffer,0
		invoke	_GetRegKeySz,addr szKeyName,addr szKeyReportFile,addr szBuffer,255
		invoke	SetDlgItemText,hWinDialog,REP_FILE,offset szBuffer
		invoke	_GetRegKeySz,addr szKeyName,addr szKeyAlarmFile,addr szBuffer,255
		invoke	SetDlgItemText,hWinDialog,ALM_FILE,offset szBuffer
		invoke	_GetRegKeySz,addr szKeyName,addr szKeyAlarmText,addr szBuffer,255
		invoke	SetDlgItemText,hWinDialog,ALM_MESSAGE,offset szBuffer
;*************** 设置文本编辑框的最大文本长度 ***********************
		invoke	SendDlgItemMessage,hWinDialog,ALM_HOUR1,EM_LIMITTEXT,2,NULL
		invoke	SendDlgItemMessage,hWinDialog,ALM_HOUR2,EM_LIMITTEXT,2,NULL
		invoke	SendDlgItemMessage,hWinDialog,ALM_MIN1,EM_LIMITTEXT,2,NULL
		invoke	SendDlgItemMessage,hWinDialog,ALM_MIN2,EM_LIMITTEXT,2,NULL
		invoke	SendDlgItemMessage,hWinDialog,ALM_MIN2,EM_LIMITTEXT,2,NULL
		invoke	SendDlgItemMessage,hWinDialog,REP_FILE,EM_LIMITTEXT,250,NULL
		invoke	SendDlgItemMessage,hWinDialog,ALM_FILE,EM_LIMITTEXT,250,NULL
		invoke	SendDlgItemMessage,hWinDialog,ALM_MESSAGE,EM_LIMITTEXT,100,NULL
		call	_FreshSetupDialog
		ret

_InitSetupDialog	endp
;********************************************************************
;	根据标志位刷新设置对话框的屏幕
;********************************************************************
_FreshSetupDialog	proc

		invoke	SetDlgItemInt,hWinDialog,ALM_HOUR1,dwHour1,FALSE
		invoke	SetDlgItemInt,hWinDialog,ALM_MIN1,dwMinute1,FALSE
		invoke	SetDlgItemInt,hWinDialog,ALM_HOUR2,dwHour2,FALSE
		invoke	SetDlgItemInt,hWinDialog,ALM_MIN2,dwMinute2,FALSE

		test	dwTempFlag,F_REPORT
		.if	ZERO?
			call	_DisableReport
		.else
			call	_EnableReport
			test	dwTempFlag,F_REPORT_MODE
			.if	!ZERO?
				call	_CheckReport1
			.else
				call	_CheckReport2
			.endif
		.endif

		test	dwTempFlag,F_ALARM
		.if	ZERO?
			call	_DisableAlarm
		.else
			call	_EnableAlarm
			test	dwTempFlag,F_ALARM_ONCE
			.if	ZERO?
				invoke	_CheckItem,CHK_ONCE,0
			.else
				invoke	_CheckItem,CHK_ONCE,1
			.endif

			test	dwTempFlag,F_TIME_MODE
			.if	!ZERO?
				call	_CheckTime1
			.else
				call	_CheckTime2
			.endif

			mov	eax,dwTempFlag
			and	eax,F_ALARM_MODE
			shr	eax,F_ALARM_MODE_
			.if	eax == 0000h
				call	_CheckAlarm1
			.elseif	eax == 0001h
				call	_CheckAlarm2
			.elseif	eax == 0002h
				call	_CheckAlarm3
			.elseif	eax == 0003h
				call	_CheckAlarm4
			.endif
		.endif

		ret

_FreshSetupDialog	endp
;********************************************************************
;	校验输入的时间是否正确
;********************************************************************
_CheckSetupTime		proc
		local	@dwTemp:DWORD

		invoke	GetDlgItemInt,hWinDialog,ALM_HOUR1,addr @dwTemp,FALSE
		.if	eax > 23
			mov	eax,23
		.endif
		mov	dwHour1,eax
		invoke	GetDlgItemInt,hWinDialog,ALM_HOUR2,addr @dwTemp,FALSE
		.if	eax > 23
			mov	eax,23
		.endif
		mov	dwHour2,eax
		invoke	GetDlgItemInt,hWinDialog,ALM_MIN1,addr @dwTemp,FALSE
		.if	eax > 59
			mov	eax,59
		.endif
		mov	dwMinute1,eax
		invoke	GetDlgItemInt,hWinDialog,ALM_MIN2,addr @dwTemp,FALSE
		.if	eax > 59
			mov	eax,59
		.endif
		mov	dwMinute2,eax
		ret

_CheckSetupTime		endp
;********************************************************************
;	闹钟设置对话框的命令处理程序
;	根据子控件设置相应的标志位
;********************************************************************
_AlarmSetupCommand	proc	hWnd:DWORD,wParam:DWORD,lParam:DWORD

		mov	eax,wParam
		.if	eax ==	ID_SETUP_OK
			call	_ApplyAlarmSetup
			invoke	EndDialog,hWinDialog,NULL
		.elseif eax ==	ID_SETUP_APPLY
			call	_ApplyAlarmSetup
		.elseif eax ==	ID_SETUP_CANCEL
			invoke	EndDialog,hWinDialog,NULL
;**************** 启用整点报时 **************************************
		.elseif	eax ==	CHK_REPORT
			invoke	SendMessage,lParam,BM_GETCHECK,0,0
			.if	eax == TRUE
				or	dwTempFlag,F_REPORT
			.else
				and	dwTempFlag,not F_REPORT
			.endif
;**************** 启用闹铃功能 **************************************
		.elseif	eax ==	CHK_ALARM
			invoke	SendMessage,lParam,BM_GETCHECK,0,0
			.if	eax == TRUE
				or	dwTempFlag,F_ALARM
			.else
				and	dwTempFlag,not F_ALARM
			.endif
;**************** 闹铃一次后关闭 ************************************
		.elseif	eax ==	CHK_ONCE
			invoke	SendMessage,lParam,BM_GETCHECK,0,0
			.if	eax == TRUE
				or	dwTempFlag,F_ALARM_ONCE
			.else
				and	dwTempFlag,not F_ALARM_ONCE
			.endif
;**************** 标准报时声音 **************************************
		.elseif	eax ==	REP_WAV1
			mov	eax,F_REPORT_MODE
			or	dwTempFlag,eax
;**************** 指定报时声音 **************************************
		.elseif	eax ==	REP_WAV2
			and	dwTempFlag,not F_REPORT_MODE
;**************** 绝对时间 ******************************************
		.elseif	eax ==	ALM_TIME
			mov	eax,F_TIME_MODE
			or	dwTempFlag,eax
;**************** 相对时间 ******************************************
		.elseif	eax ==	ALM_FROMNOW
			and	dwTempFlag,not F_TIME_MODE
;**************** 标准闹铃声音 **************************************
		.elseif	eax == ALM_WAV1
			and	dwTempFlag,not F_ALARM_MODE
			or	dwTempFlag,000000000000b
;**************** 指定闹铃声音 **************************************
		.elseif	eax == ALM_WAV2
			and	dwTempFlag,not F_ALARM_MODE
			or	dwTempFlag,000100000000b
;**************** 到时候显示对话框 **********************************
		.elseif	eax == ALM_MSG
			and	dwTempFlag,not F_ALARM_MODE
			or	dwTempFlag,001000000000b
;**************** 到时候关闭计算机 **********************************
		.elseif	eax == ALM_SHUTDOWN
			and	dwTempFlag,not F_ALARM_MODE
			or	dwTempFlag,001100000000b
;**************** 声音预览 ******************************************
		.elseif	eax == REP_PLAY1
			invoke	PlaySound,IDW_SOUND,hInstance,SND_RESOURCE or SND_ASYNC
		.elseif	eax == REP_PLAY2
			invoke	_GetRegKeySz,addr szKeyName,addr szKeyReportFile,addr szBuffer,255
			invoke	PlaySound,addr szBuffer,NULL,SND_FILENAME or SND_ASYNC
		.elseif	eax == ALM_PLAY1
			invoke	PlaySound,IDW_SOUND,hInstance,SND_RESOURCE or SND_ASYNC
		.elseif	eax == ALM_PLAY2
			invoke	_GetRegKeySz,addr szKeyName,addr szKeyAlarmFile,addr szBuffer,255
			invoke	PlaySound,addr szBuffer,NULL,SND_FILENAME or SND_ASYNC
;**************** 声音文件浏览打开 ***********************************
		.elseif	eax == REP_BROWSE
			invoke	GetDlgItemText,hWinDialog,REP_FILE,offset szBuffer,255
			mov	stOpenFile.Flags,OFN_FILEMUSTEXIST
			mov	stOpenFile.lStructSize,SIZEOF stOpenFile
			mov	eax,hWinDialog
			mov	stOpenFile.hWndOwner,eax
			mov	stOpenFile.lpstrFilter,offset szFilter
			mov	stOpenFile.lpstrFile,offset szBuffer
			mov	stOpenFile.nMaxFile,255
			mov	stOpenFile.lpstrInitialDir,0
			mov	stOpenFile.lpstrTitle,offset szTitleOpen
			mov	stOpenFile.lpstrDefExt,offset szExt
			invoke	GetOpenFileName,addr stOpenFile
			.if	eax != FALSE
				invoke	SetDlgItemText,hWinDialog,REP_FILE,offset szBuffer
				invoke	_SetRegKeySz,addr szKeyName,\
					addr szKeyReportFile,addr szBuffer,255
			.endif
		.elseif	eax == ALM_BROWSE
			invoke	GetDlgItemText,hWinDialog,ALM_FILE,offset szBuffer,255
			mov	stOpenFile.Flags,OFN_FILEMUSTEXIST
			mov	stOpenFile.lStructSize,SIZEOF stOpenFile
			mov	eax,hWinDialog
			mov	stOpenFile.hWndOwner,eax
			mov	stOpenFile.lpstrFilter,offset szFilter
			mov	stOpenFile.lpstrFile,offset szBuffer
			mov	stOpenFile.nMaxFile,255
			mov	stOpenFile.lpstrInitialDir,0
			mov	stOpenFile.lpstrTitle,offset szTitleOpen
			mov	stOpenFile.lpstrDefExt,offset szExt
			invoke	GetOpenFileName,addr stOpenFile
			.if	eax != FALSE
				invoke	SetDlgItemText,hWinDialog,ALM_FILE,offset szBuffer
				invoke	_SetRegKeySz,addr szKeyName,\
					addr szKeyAlarmFile,addr szBuffer,255
			.endif
		.else
			ret
		.endif

		call	_CheckSetupTime
		call	_FreshSetupDialog
		ret

_AlarmSetupCommand	endp
;********************************************************************
;	提交设置参数
;********************************************************************
_ApplyAlarmSetup	proc

		call	_CheckSetupTime		;校验时间输入是否正确

		mov	eax,dwTempFlag		;提交标志
;		mov	ebx,001003f0h
;		and	eax,ebx
;		not	ebx
;		and	dwFlag,ebx
;		or	dwFlag,eax
		mov	dwFlag,eax

		test	dwFlag,F_TIME_MODE	;将“从现在起”时间计算为“闹铃时间”
		.if	!ZERO?
			mov	eax,dwHour1
			mov	edx,dwMinute1
			mov	dwAlarmHour,eax
			mov	dwAlarmMinute,edx
			invoke	_TimeSub,dwAlarmHour,dwAlarmMinute
			mov	dwHour2,eax
			mov	dwMinute2,edx
		.else
			invoke	_TimeAdd,dwHour2,dwMinute2
			mov	dwAlarmHour,eax
			mov	dwAlarmMinute,edx
			mov	dwHour1,eax
			mov	dwMinute1,edx
		.endif
		call	_FreshSetupDialog	;刷新屏幕信息

;*************** 保存文本信息到注册表 *******************************
		invoke	GetDlgItemText,hWinDialog,REP_FILE,offset szBuffer,255
		invoke	_SetRegKeySz,addr szKeyName,addr szKeyReportFile,addr szBuffer,255
		invoke	GetDlgItemText,hWinDialog,ALM_FILE,offset szBuffer,255
		invoke	_SetRegKeySz,addr szKeyName,addr szKeyAlarmFile,addr szBuffer,255
		invoke	GetDlgItemText,hWinDialog,ALM_MESSAGE,offset szBuffer,255
		invoke	_SetRegKeySz,addr szKeyName,addr szKeyAlarmText,addr szBuffer,255

		ret

_ApplyAlarmSetup	endp
;********************************************************************
;	整点报时
;********************************************************************
_ClockReport	proc

		test	dwFlag,F_REPORT_MODE
		.if	!ZERO?
			invoke	PlaySound,IDW_SOUND,hInstance,SND_RESOURCE or SND_ASYNC
		.else
			invoke	_GetRegKeySz,addr szKeyName,addr szKeyReportFile,addr szBuffer,255
			.if	szBuffer == 0
				invoke	PlaySound,IDW_SOUND,hInstance,SND_RESOURCE or SND_ASYNC
			.else
				invoke	PlaySound,addr szBuffer,NULL,SND_FILENAME or SND_ASYNC
			.endif
		.endif
		ret

_ClockReport	endp
;********************************************************************
;	闹铃标准声音播放后台线程
;********************************************************************
_AlarmUseWave	proc	uses ebx ecx edx esi edi,\
			dwParam:DWORD
			local	@dwCount

		mov	@dwCount,0
		.while	@dwCount < 15
			invoke	Sleep,1000
			invoke	PlaySound,IDW_SOUND,hInstance,SND_RESOURCE or SND_ASYNC
			inc	@dwCount
		.endw

		ret

_AlarmUseWave	endp
;********************************************************************
_AlarmUseStand	proc		;标准声音报时

		invoke	PlaySound,IDW_SOUND,hInstance,SND_RESOURCE or SND_ASYNC
		.if	eax == FALSE
			call	_AlarmUseDialog	;如果放声音失败,使用对话框
		.else
			invoke	CreateThread,NULL,NULL,offset _AlarmUseWave,\
				NULL,NULL,offset hAlarmThread
		.endif
		ret

_AlarmUseStand	endp
;********************************************************************
_AlarmUseDialog	proc

		invoke	_GetRegKeySz,addr szKeyName,addr szKeyAlarmText,addr szBuffer,255
		.if	szBuffer == 0
			mov	al,3
			call	_Random
			add	eax,IDS_0
			invoke	LoadString,hInstance,eax,offset szBuffer,255
		.endif
		invoke	MessageBox,hWinMain,offset szBuffer,\
			offset szAlarmTitle,MB_ICONINFORMATION or MB_OK
		ret

_AlarmUseDialog	endp
;********************************************************************
;	闹铃
;********************************************************************
_ClockAlarm	proc

		mov	eax,dwFlag
		and	eax,F_ALARM_MODE
		shr	eax,F_ALARM_MODE_
		.if	eax ==	0000h
			call	_AlarmUseStand
		.elseif	eax ==	0001h
			invoke	_GetRegKeySz,addr szKeyName,addr szKeyAlarmFile,addr szBuffer,255
			.if	szBuffer == 0
				call	_AlarmUseStand
			.else
				invoke	PlaySound,addr szBuffer,NULL,SND_FILENAME or SND_ASYNC
				.if	eax == FALSE	;如果放声音失败,使用对话框
					call	_AlarmUseDialog
				.endif
			.endif
		.elseif	eax ==	0002h
			call	_AlarmUseDialog
		.elseif	eax ==	0003h
			invoke	DialogBoxParam,hInstance,DLG_SHUTDOWN,\
				hWinMain,offset DialogMainProc,DLG_SHUTDOWN
		.endif
		test	dwFlag,F_ALARM_ONCE		;闹铃一次后取消
		.if	!ZERO?
			and	dwFlag,not F_ALARM;关闭闹铃功能
		.endif
		ret

_ClockAlarm	endp
;********************************************************************
;	外观设置对话框的命令处理程序
;	根据子控件设置相应的标志位
;********************************************************************
_LookSetupCommand	proc	hWnd:DWORD,wParam:DWORD,lParam:DWORD

		mov	eax,wParam
		.if	eax ==	ID_LOOK_OK

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -