Windows SDK编程:解析消息循环与窗口过程

需积分: 32 3 下载量 181 浏览量 更新于2024-08-19 收藏 249KB PPT 举报
"这篇文章除了讲解创建消息循环的核心概念外,还涉及了Windows SDK编程,特别是关于非窗口编程和窗口编程的区别,以及Windows应用程序的特点。文章提到了使用MFC(Microsoft Foundation Classes)库进行Windows应用开发的优势,强调了Windows用户界面的直观性和设备无关的图形操作功能。" 在Windows SDK编程中,创建消息循环是核心部分,它确保了应用程序能够及时处理来自用户的输入。Windows系统为每个应用程序维护一个消息队列,当用户进行键盘输入、鼠标点击等操作时,这些事件会被转化为消息并放入队列。消息循环由`GetMessage`函数启动,它从队列中取出消息。如果消息不是WM_QUIT,`GetMessage`会返回TRUE并继续循环;一旦收到WM_QUIT,循环结束,应用程序退出。 消息循环的工作流程大致如下: 1. `GetMessage`函数从消息队列中取出消息,通常接收所有属于应用程序窗口的消息。 2. `TranslateMessage`函数处理键盘消息,将WM_KEYDOWN和WM_KEYUP转换为WM_CHAR消息,提供ASCII字符。 3. `DispatchMessage`函数将消息传递给相应的窗口过程,即在窗口类注册时指定的函数,通常是`WindowsProc`。 在Windows编程中,有非窗口编程(如控制台程序)和窗口编程两种方式。窗口编程主要通过调用Win32 API函数或使用MFC库进行。MFC库提供了一种面向对象的方式来封装Win32 API,简化了Windows应用的开发,开发者可以通过应用程序向导快速创建框架,然后在此基础上添加功能代码。 Windows应用程序的特点包括: 1. 面向对象的图形用户界面,直观易用,符合CUA标准。 2. 用户界面统一,减少用户学习成本。 3. 强大的GDI(图形设备接口),支持设备无关的图形输出,能在不同设备上呈现一致的视觉效果。 GDI+是GDI的扩展,引入了对COM的支持,增强了图形渲染能力,包括矢量图形、图像处理和文本渲染等,使得开发者能创建更丰富、更美观的图形界面。 创建消息循环是Windows应用程序处理用户输入的关键,而MFC和GDI/GDI+则是Windows SDK编程中的重要工具,为开发者提供了便利和强大的图形功能。

优化代码 public static void main(String[] args) { ZkemSDK sdk = new ZkemSDK(); boolean connFlag = sdk.connect("192.168.1.201", 4370); System.out.println("conn:" + connFlag); boolean readGeneralLogData = sdk.readGeneralLogData(); System.out.println("读取打卡机信息到缓存:" + readGeneralLogData); //如果连接打卡机和读取信息到缓存都没问题再去缓存中获取数据 if (connFlag) { //获取打卡机所有的用户信息 List<UserInfo> userInfo = sdk.getUserInfo(); //转化为JSON字符串 String usersJsonString = JSON.toJSONString(userInfo); //反序列化对象 List<UserInfo> userInfos = JSON.parseArray(usersJsonString, UserInfo.class); userInfos.forEach(System.out::println); for (UserInfo info : userInfos) { String name = info.getName(); Boolean enabled = info.getEnabled(); String pwd = info.getPassword(); Integer privilege = info.getPrivilege(); String enrollNumber = info.getEnrollNumber(); Integer userId = Integer.valueOf(enrollNumber); /** * 上面的都是打卡机的数据,可以根据自己的需求处理 / System.out.println(name+"-"+enabled+"-"+pwd+"-"+privilege+"-"+userId+""); } List<Map<String, Object>> generalLogData = sdk.getGeneralLogData(); String logDataJsonString = JSON.toJSONString(generalLogData); List<LogData> logDatas = JSON.parseArray(logDataJsonString, LogData.class); logDatas.forEach(System.out::println); for(LogData data : logDatas){ //打卡机的时间 String time = data.getTime(); String enrollNumber = data.getEnrollNumber(); /* * data有很多的数据,可以根据自己的业务逻辑拿想要的数据 * 我这里只取了打卡时间和enrollNumber * */ Map<String, Object> userInfoByNumber = getUserInfoByNumber(enrollNumber); System.out.println(time); } } }

2023-07-08 上传