版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Windows应用程序对键盘与鼠标的响应Windows系统编程·用户输入处理机制Contents课程目录Windows输入处理核心模块概览,覆盖键盘、鼠标与消息循环全链路。01Windows输入处理基础02键盘输入模型详解03消息循环与处理机制04键盘消息类型与处理05鼠标输入处理06综合应用实例CHAPTER01Windows输入处理基础理解Windows系统的输入处理架构与消息机制SYSTEMARCHITECTUREWindows输入处理架构Windows输入处理采用三层架构:硬件层产生原始信号,内核层负责转换与分发,应用层通过消息循环接收处理,实现设备无关性与统一交互。输入设备层键盘产生扫描代码标识按键动作,鼠标产生位移与按钮状态信号设备驱动程序负责将硬件信号转换为系统可识别的标准格式扫描码系统处理层Windows内核接收设备驱动传来的信号,转换为消息结构体系统将消息放入消息队列,根据窗口焦点确定目标线程消息队列应用程序层应用程序通过消息循环从队列中获取消息并进行预处理窗口过程函数接收消息并执行相应的业务逻辑处理消息循环ProgrammingModel事件驱动编程模型Windows应用程序采用事件驱动模型,程序启动后进入消息循环等待状态,由用户操作触发事件消息并执行相应处理逻辑——这种被动响应机制是GUI应用程序的核心特征。顺序执行传统程序按预设顺序依次执行指令,执行流程由代码逻辑决定,程序完全控制执行路径Sequential消息循环程序启动后进入消息循环,持续等待系统分发的用户事件,这是GUI程序的运行基础MessageLoop事件触发用户按键、鼠标点击等操作触发系统生成消息,并投递到应用程序的消息队列中等待处理EventTrigger消息处理从队列取出消息,根据消息类型调用对应的处理函数,完成特定的界面响应或业务逻辑Dispatch空闲等待无消息时程序进入空闲状态,CPU资源被系统回收分配给其他任务,实现高效的资源利用IdleWindowsMessage消息的概念与结构消息是Windows系统向应用程序传递事件信息的标准数据结构,由MSG结构体定义。每条消息包含窗口句柄、消息类型、附加参数等字段,系统通过消息队列机制将用户输入事件有序传递给目标应用程序处理。MSG结构体关键字段说明字段名数据类型含义说明hwndHWND消息所属窗口的句柄,标识消息的目标窗口messageUINT消息类型标识符,如WM_KEYDOWN、WM_LBUTTONDOWNwParamWPARAM附加参数1,通常存储消息相关的附加信息lParamLPARAM附加参数2,通常存储更多附加信息或坐标数据timeDWORD消息产生的时间戳ptPOINT消息产生时的鼠标屏幕坐标MSG结构体定义了Windows消息的完整信息格式WINDOWSMESSAGING消息队列机制Windows采用双层消息队列架构:系统消息队列由内核统一管理硬件输入,按焦点状态分发至各线程应用队列,实现有序消息传递。系统消息队列由Windows内核维护的全局队列,接收所有硬件设备产生的原始输入事件,包括键盘、鼠标等外设信号。系统根据当前焦点窗口判断消息归属,将消息分发到对应线程的应用队列,确保消息准确送达目标进程。KERNEL·GLOBAL应用程序消息队列每个GUI线程拥有独立的消息队列,存储分发到该线程的所有待处理消息,实现线程级别的消息隔离与管理。线程通过消息循环函数从队列中依次取出消息并进行处理,保证消息按到达顺序被响应,避免并发冲突。PER-THREAD消息分发规则键盘消息发送到拥有键盘焦点的窗口所属线程的消息队列,确保输入定向到当前激活的输入区域。鼠标消息发送到鼠标光标所在位置的窗口所属线程的消息队列,实现精确的点击事件定位与传递。FOCUS·CURSORChapter02键盘输入模型详解从扫描代码到字符消息的完整处理流程INPUTPROCESSING键盘输入处理流程键盘输入经历四个处理阶段:硬件产生扫描代码标识物理按键位置,驱动程序转换为虚拟键码标识按键功能,键盘布局模块根据语言设置转换为字符消息,最终系统将消息投递到目标应用程序队列。这一流程实现了设备无关性和语言无关性的双重抽象。STEP01·硬件层键盘硬件检测按键动作,产生扫描代码标识按键的物理位置STEP02·驱动层键盘驱动程序将扫描代码转换为虚拟键码,标识按键的功能含义STEP03·布局层键盘布局模块根据当前语言设置,将虚拟键码转换为对应的字符消息STEP04·系统层系统将完整的消息结构放入系统消息队列,等待分发到目标线程STEP05·应用层目标线程的消息循环获取消息并派发到对应窗口过程进行处理INPUTSYSTEM扫描代码与虚拟键码扫描代码是硬件层面的物理按键标识,与键盘布局和输入语言无关;虚拟键码是系统层面的功能标识,由驱动程序将扫描代码转换而来,实现了设备无关性。虚拟键码以VK_开头的常量定义,如VK_RETURN、VK_SHIFT,是应用程序处理按键消息的基础依据。扫描代码01硬件原始标识符键盘硬件产生的原始标识符,表示按键在键盘上的物理位置,是底层输入信号的基础。02布局无关性同一物理按键无论输入状态如何,产生的扫描代码始终相同,不受语言布局影响。03成对编码机制按键按下和释放分别产生不同的扫描代码(MakeCode和BreakCode),用于检测按键状态变化。虚拟键码01系统标准常量系统定义的与设备无关的按键标识符,以VK_常量形式定义,提供统一的编程接口。02常见键码示例VK_RETURN(回车键)、VK_SHIFT(换档键)、VK_CONTROL(控制键)等,语义清晰明确。03驱动转换层驱动程序负责将扫描代码转换为虚拟键码,屏蔽底层硬件差异,实现跨设备兼容。WINDOWSMESSAGING键盘焦点与激活键盘焦点是窗口的临时属性,决定了哪个窗口接收键盘输入消息。系统通过焦点机制实现多窗口环境下的输入路由,当焦点转移时系统发送WM_SETFOCUS和WM_KILLFOCUS消息通知相关窗口,窗口据此管理插入符号的显示状态和输入缓冲区的激活状态。路由唯一焦点同一时刻只有一个窗口拥有键盘焦点,所有键盘消息路由到该窗口。系统通过全局焦点队列管理输入流向,确保按键事件准确送达目标窗口。单一接收者Alt+Tab焦点转移用户点击窗口或Alt+Tab切换时触发焦点转移,系统更新消息路由目标。焦点变化会触发窗口激活状态同步更新。用户交互触发SETFOCUS获取焦点窗口收到WM_SETFOCUS消息时应创建并显示插入符号,准备接收输入。此时窗口需要初始化输入缓冲区,设置光标闪烁频率。WM_SETFOCUSKILLFOCUS失去焦点窗口收到WM_KILLFOCUS消息时应隐藏并销毁插入符号,释放输入状态。同时保存当前输入内容,清理临时资源。WM_KILLFOCUS父子父子协调父窗口与子窗口之间的焦点管理需要协调,避免输入状态混乱。子窗口获取焦点时父窗口保持激活,形成层级化的焦点链。层级焦点链KeyboardLayout键盘布局与多语言支持键盘布局定义了虚拟键码到字符的映射规则,是实现多语言输入的基础。系统支持动态切换键盘布局,同一物理按键在不同布局下可产生不同字符。01键盘布局是虚拟键码到字符的映射表,定义了按键的实际字符输出映射表02系统支持多种语言布局并存,用户可通过快捷键或任务栏动态切换动态切换03同一按键在不同布局下可能产生不同字符,如美式布局与法式布局的差异多字符04GetKeyboardLayout函数可获取指定线程当前使用的键盘布局句柄GET05ActivateKeyboardLayout函数可在运行时激活指定的键盘布局ACTIVATECHAPTER03消息循环与处理机制掌握Windows应用程序的核心运行框架WINDOWSAPI消息循环的实现消息循环是Windows应用程序的核心运行框架,通过while循环持续获取、翻译、分发消息,在收到WM_QUIT时终止。消息循环核心函数说明函数名功能说明返回值含义GetMessage从线程消息队列中获取一条消息非零=成功,0=WM_QUIT,-1=错误PeekMessage查看消息但不从队列中移除非零=有消息,0=无消息TranslateMessage将虚拟键消息转换为字符消息无返回值DispatchMessage将消息派发到窗口过程函数无返回值PostQuitMessage向消息队列投递WM_QUIT消息无返回值消息循环相关函数的功能与返回值说明WINDOWSAPI·消息处理TranslateMessage函数TranslateMessage是消息预处理的关键函数,它检测WM_KEYDOWN/WM_KEYUP消息并根据当前键盘布局将其转换为WM_CHAR字符消息。该函数不修改原始消息,而是在队列中生成新的字符消息,使窗口过程能够同时接收虚拟键消息和字符消息,满足不同的输入处理需求。消息类型检测检测传入消息是否为虚拟键消息,识别WM_KEYDOWN或WM_KEYUP类型,为后续转换做准备WM_KEYDOWNWM_KEYUPStep1键码字符转换根据当前键盘布局将虚拟键码转换为对应的字符编码,支持多语言输入场景键盘布局字符编码布局映射转换字符消息生成在消息队列中生成WM_CHAR字符消息,供后续消息循环获取处理,实现输入标准化WM_CHAR消息队列Step3原始消息保留不修改原始虚拟键消息,窗口过程仍可同时接收按键消息和字符消息,双通道并行处理原始保留双通道并行消息处理非键消息过滤对于非虚拟键消息(如鼠标消息)直接返回,不产生任何副作用,保证系统稳定性安全过滤零副作用消息类型安全WindowsMessageLoopDispatchMessage与窗口过程DispatchMessage根据消息中的窗口句柄查找对应的窗口过程函数并调用执行,实现消息的自动路由与业务逻辑解耦。01句柄查找—DispatchMessage根据消息的hwnd字段查找对应窗口的窗口过程函数地址02回调调用—系统调用窗口过程函数,将消息参数传递给应用程序的处理逻辑03消息分发—窗口过程通过switch-case结构根据message字段分发到具体处理代码04默认兜底—未处理的消息应调用DefWindowProc执行系统默认处理,保证基本功能正常05返回值语义—窗口过程处理完消息后返回结果值,部分消息的返回值具有特殊含义Win32MessageHandling加速键表处理加速键表是Windows的快捷键处理机制,通过TranslateAccelerator函数在消息循环中优先匹配快捷键定义。匹配成功时直接生成WM_COMMAND消息跳过正常分发流程,实现快捷键的快速响应。加速键表定义快捷键与命令ID的映射表定义组合键触发的具体操作,建立用户按键与程序命令的关联关系资源文件定义与加载通过.rc资源文件定义键表,使用LoadAccelerators函数加载到内存消息循环集成01TranslateAccelerator优先检查在消息循环中首先调用,优先匹配键盘消息与加速键表定义02匹配成功直接发送WM_COMMAND返回非零表示已处理,跳过TranslateMessage和DispatchMessage03匹配失败继续正常消息流程返回零表示不匹配,继续调用TranslateMessage进行消息翻译CHAPTER04键盘消息类型与处理掌握各类键盘消息的特征与处理技巧WINDOWSMESSAGE按键消息WM_KEYDOWN/WM_KEYUPWM_KEYDOWN和WM_KEYUP分别在按键按下和释放时产生,携带虚拟键码而非字符信息,适合处理功能键和方向键。触发时机WM_KEYDOWN在按键按下时产生,WM_KEYUP在按键释放时产生wParam存储虚拟键码(如VK_LEFT、VK_F1),标识按键的功能含义Bit0–15lParam低16位存储重复计数,表示本次消息对应的按键次数Bit16–24第16–23位存储扫描码,第24位标识是否为扩展键(如右Alt)Bit30存储先前状态,可用于区分首次按下和重复触发Bit31存储转换状态,按下时为0,释放时为1WindowsMessage字符消息WM_CHARWM_CHAR由TranslateMessage从WM_KEYDOWN转换而来,携带实际字符代码,已综合考虑键盘布局与修饰键状态,wParam直接存储字符编码,是文本输入的主要消息类型。转换生成由TranslateMessage函数将WM_KEYDOWN转换生成,非系统直接产生。此转换过程在消息循环中自动完成,无需开发者额外干预。TranslateMessage字符编码wParam存储字符代码(ASCII或Unicode),可直接用于文本显示。在Unicode应用程序中,wParam包含完整的16位字符值。ASCII/Unicode环境感知已考虑键盘布局、Shift状态、CapsLock状态等输入环境因素。系统根据当前输入法状态和键盘映射表自动处理修饰键组合。Shift·Caps典型触发字母键、数字键、Backspace、Enter、Tab、ESC等常用按键。控制字符如退格、回车同样通过WM_CHAR传递,便于统一处理。A-Z·0-9主要消息大多数文本输入场景只需处理WM_CHAR,无需关注底层按键消息。应用程序可专注于字符级处理,简化输入逻辑的实现复杂度。TextInputWindowsMessageHandlingWM_CHAR消息处理示例WM_CHAR消息处理通过switch-case结构根据wParam字符代码分类处理:退格键(0x08)删除前一字符,换行符(0x0A)执行换行,ESC键(0x1B)取消操作,Tab键(0x09)插入缩进,回车键(0x0D)确认输入,default分支处理所有可显示字符并更新文本缓冲区。常见字符代码与处理方式字符代码对应按键典型处理方式0x08Backspace删除光标前一字符,更新显示0x09Tab插入制表符或转换为空格0x0A换行符执行换行操作,移动光标到下一行0x0D回车键确认输入或执行命令0x1BESC取消当前操作或关闭对话框其他可显示字符添加到文本缓冲区并更新显示WM_CHAR消息中常见字符代码的处理方式对照WindowsMessageHandling系统键盘消息WM_SYSKEYDOWN和WM_SYSCHAR是系统级键盘消息,在Alt键组合或菜单激活时产生,大多数应用交由DefWindowProc默认处理即可。触发条件用户按下Alt键与其他键的组合时产生系统键盘消息窗口无焦点时按下的键也会产生系统消息,如激活菜单的按键Alt+Key消息类型WM_SYSKEYDOWN系统按键按下,wParam存储虚拟键码WM_SYSKEYUP系统按键释放,标识Alt组合键释放WM_SYSCHAR系统字符消息,由TranslateMessage转换3Types处理建议大多数应用无需特殊处理,交由DefWindowProc默认处理即可如需自定义Alt快捷键,可在窗口过程中拦截处理特定组合DefWindowProcWindowsMessageHandling死字符消息处理死字符是组合字符机制的一部分,用于生成带音标的字符(如â、ñ)。系统产生WM_DEADCHAR消息通知应用程序收到死字符,应用需缓存该字符并等待下一字符到来时进行组合。01组合字符机制死字符本身不直接显示,需与后续字符组合形成带音标的复合字符Composite02WM_DEADCHAR按下死字符键时产生该消息,wParam参数存储死字符代码wParam03WM_SYSDEADCHARAlt+死字符组合时产生,属于系统级死字符消息SystemLevel04缓存与组合应用程序需缓存死字符,等待下一WM_CHAR消息到来时执行组合逻辑WM_CHAR05键盘布局规则组合规则由键盘布局定义,不同语言布局支持不同的死字符组合LayoutWindowsAPI插入符号管理插入符号是文本输入位置的视觉指示器,通过WindowsAPI进行管理。关键原则是获得焦点时创建显示、失去焦点时隐藏销毁。函数名功能说明调用时机CreateCaret创建插入符号,定义形状和尺寸收到WM_SETFOCUS时ShowCaret显示插入符号,开始闪烁创建后立即调用SetCaretPos设置插入符号的窗口内坐标字符输入或光标移动时HideCaret隐藏插入符号,停止闪烁绘图操作前临时隐藏DestroyCaret销毁插入符号,释放系统资源收到WM_KILLFOCUS时i生命周期管理CreateCaret与DestroyCaret必须成对调用,确保资源正确释放。每个窗口应独立管理自己的插入符号状态,避免与其他窗口冲突。!系统共享资源插入符号是系统全局共享资源,同一时刻只能有一个窗口拥有活动的插入符号。切换焦点时必须先销毁旧窗口的符号,再创建新窗口的符号。插入符号是系统共享资源,同一时刻只能有一个窗口拥有活动的插入符号Win32API·KeyboardInput键盘状态检测GetKeyState和GetAsyncKeyState是检测按键状态的两个核心函数。GetKeyState返回消息产生时的按键状态,与消息处理逻辑同步;GetAsyncKeyState返回当前实时状态,适用于游戏等需要即时响应的场景。返回值的高位表示按键是否按下,低位表示切换键(如CapsLock)是否处于开启状态。Windows提供两种按键检测机制,分别面向消息驱动与实时轮询两种架构。理解它们的时序差异和返回值含义,是正确处理键盘输入的基础。两个函数均返回SHORT类型值——高位反映按键的物理按下状态,低位反映切换键(如CapsLock)的开关状态。选择哪个函数,取决于应用对时序精度的要求。GetKeyState返回消息产生时的按键状态,与消息处理逻辑保持同步高位为1表示按键按下,低位为1表示切换键处于开启状态适用于消息处理过程中检测修饰键状态,如Shift+字母组合GetAsyncKeyState返回调用时刻的实时按键状态,不受消息队列时序影响高位为1表示当前按下,低位为1表示上次调用后曾被按下适用于游戏循环等需要实时检测按键的场景CHAPTER05鼠标输入处理掌握鼠标消息类型与坐标处理技术WindowsMessageHandling鼠标消息概述鼠标消息分为客户区消息和非客户区消息两大类。客户区消息由应用程序处理;非客户区消息通常由系统默认处理。lParam参数按低16位x、高16位y格式存储位置信息。客户区鼠标消息01WM_MOUSEMOVE鼠标在客户区移动时持续产生02WM_LBUTTONDOWN/UP左键按下和释放03WM_RBUTTONDOWN/UP右键按下和释放04WM_LBUTTONDBLCLK左键双击事件坐标解析01lParam低16位存储x坐标,高16位存储y坐标02使用LOWORD和HIWORD宏提取坐标值03坐标相对于窗口客户区左上角(0,0)点Win32·MouseInput鼠标点击消息处理鼠标点击通过DOWN/UP配对实现交互,wParam携带修饰键标志,SetCapture支持跨边界拖拽捕获。01WM_LBUTTONDOWN—左键按下时产生用于记录操作起始位置,标记交互开始点02WM_LBUTTONUP—左键释放时产生用于完成操作并计算结果,触发最终响应03wParam修饰键标志包含MK_CONTROL、MK_SHIFT等标志位,支持检测组合点击操作04WM_LBUTTONDBLCLK—双击消息需窗口类注册时指定CS_DBLCLKS样式才能接收05SetCapture—鼠标捕获鼠标移出窗口后继续捕获消息,实现跨边界拖拽选择功能06ReleaseCapture—释放捕获释放鼠标捕获,恢复正常的消息路由机制Win32MessageHandling鼠标移动与滚轮消息WM_MOUSEMOVE在鼠标移动时持续产生,频率取决于硬件采样率;鼠标静止时不产生该消息。WM_MOUSEWHEEL处理滚轮滚动,wParam高16位存储带符号的滚动值,正值为向上、负值为向下,单位为WHEEL_DELTA(120)。滚轮消息默认发送到焦点窗口,而非光标下的窗口。鼠标移动消息WM_MOUSEMOVE在鼠标移动时持续产生,静止时不触发。该消息的频率直接取决于硬件采样率和系统配置,高频场景下需特别注意性能优化。可通过wParam参数检测移动过程中是否同时按住鼠标按键(如MK_LBUTTON、MK_RBUTTON)或修饰键(如MK_SHIFT、MK_CONTROL)。高频移动场景下应采取适当的优化策略,如使用定时器节流、脏区域标记或双缓冲技术,避免过度重绘导致界面卡顿。WM_MOUSEMOVE滚轮消息WM_MOUSEWHEEL在滚轮滚动时产生,wParam的高16位存储带符号的滚动值,低16位包含修饰键状态信息。正值表示向上滚动,负值表示向下滚动,标准单位为WHEEL_DELTA(120)。可通过累加滚动值实现平滑滚动或页面级跳转。滚轮消息默认发送到当前焦点窗口,而非光标下方的窗口。若需改变此行为,可通过窗口子类化或消息钩子实现自定义路由。WM_MOUSEWHEELWindowsAPI·MouseInput鼠标捕获与坐标转换鼠标捕获机制通过SetCapture使指定窗口持续接收鼠标消息,即使鼠标移出窗口边界,是实现拖拽操作的关键技术。ReleaseCapture释放捕获恢复正常路由。坐标转换函数ClientToScreen和ScreenToClient在客户区坐标与屏幕坐标之间转换,支持多窗口交互和弹出菜单定位等场景。01SetCapture函数使指定窗口持续接收鼠标消息,即使鼠标移出窗口边界。这是实现拖拽操作的基础机制,确保鼠标事件不丢失。04ClientToScreen将客户区坐标转换为屏幕绝对坐标,常用于定位弹出窗口、菜单或工具提示的位置,确保精确定位。02拖拽操作中,按下鼠标时调用SetCapture开始捕获,释放鼠标时调用ReleaseCapture结束捕获,恢复正常消息路由。05ScreenToClient将屏幕坐标转换为客户区相对坐标,用于处理全局鼠标事件,将绝对位置映射到窗口内部坐标系。03同一时刻只能有一个窗口拥有鼠标捕获。新的捕获请求会自动替换旧的捕获状态,确保系统行为的一致性和可预测性。06GetCursorPos获取鼠标屏幕坐标,配合坐标转换函数实现精确定位,支持跨窗口的鼠标位置计算与同步。CHAPTER06综合应用实例通过实际案例巩固输入处理知识WindowsProgramming简单文本编辑器实现简单文本编辑器综合运用了缓冲区管理、插入符号控制、字符输入处理和光标移动等核心技术。WM_CREATE分配缓冲区,WM_SETFOCUS创建插入符号,WM_CHAR处理字符输入并更新显示,WM_KEYDOWN处理方向键移动光标位置,WM_PAINT负责文本内容的绘制输出。初始化阶段01WM_CREATE时分配文本缓冲区,获取当前字体度量信息02根据客户区大小和字体尺寸计算每行字符数和最大行数WM_CREATE输入处理01WM_SETFOCUS创建插入符号并显示,准备接收键盘输入02WM_CHAR将字符存入缓冲区,更新光标位置并移动插入符号03WM_KEYDOWN处理方向键,计算新光标坐标并更新插入符号位置WM_CHAR显示输出01WM_PAINT遍历缓冲区内容,使用TextOut逐行绘制文本02处理窗口大小变化时重新计算行长度和行数限制WM_PAINTMOUSEINTERACTION绘图程序鼠标交互绘图程序通过鼠标消息三阶段处理实现拖拽绘图:BUTTO
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 木活字印刷工岗位技能考试试卷及答案
- 基于SPI的Flash读写控制器在故障解决课程设计
- 变流技术课程设计
- 铝材挤压车间操作工考试试卷及答案
- 2026年幼儿园师德师风学习笔记与心得撰写课件
- 2026年小学教职工师德师风年度总结表彰课件
- 企业新人快速适应岗位能力提升课程
- 2027年伤口换药技术培训
- 树林征收补偿方案范本
- 智能生产线集成调试与运行课件 ABB工业机器人基础认知
- 煤矿一通三防专项培训
- 高速公路护坡劳务合同
- T/CCMA 0137-2022防撞缓冲车
- 企业禁化武管理制度
- B超室管理制度
- 小儿推拿(大全)课件
- 高三物理一轮复习计划:重点与难点分析
- 《混凝土结构设计原理》全套教学课件
- 2024年贵阳市中考语文试题及答案
- (1000题)中级消防设施操作员模拟试题及答案
- 堤防波浪壅高、爬高计算表格
评论
0/150
提交评论