Cangjie-SIG/RGF_CJ系统信息:硬件信息的获取显示

Cangjie-SIG/RGF_CJ系统信息:硬件信息的获取显示

【免费下载链接】RGF_CJ RGF是Windows系统下的通用渲染框架,其基于Direct3D、Direct2D、DXGI、DirectWrite、WIC、GDI、GDIplus等技术开发。RGF仓颉版(后续简称"RGF")基于RGF(C/C++版)封装优化而来。RGF为开发者提供轻量化、安全、高性能以及高度一致性的2D渲染能力,并且提供对接Direct3D的相关接口,以满足开发者对3D画面渲染的需求。 【免费下载链接】RGF_CJ 项目地址: https://gitcode.com/Cangjie-SIG/RGF_CJ

引言

在Windows应用开发中,获取和显示系统硬件信息是一项基础但至关重要的功能。无论是系统监控工具、性能分析软件,还是需要适配不同硬件环境的应用程序,都离不开对系统信息的准确获取。RGF_CJ作为Windows系统下的通用渲染框架,提供了丰富的Windows API封装,让开发者能够轻松获取和处理系统硬件信息。

本文将深入探讨如何在RGF_CJ框架中获取和显示系统硬件信息,包括CPU、内存、磁盘、显示器等关键硬件数据的获取方法,并通过实际代码示例展示如何将这些信息优雅地呈现在用户界面中。

系统信息获取的核心API

RGF_CJ通过rgf.win_def包提供了完整的Windows系统API封装,以下是一些关键的系统信息获取函数:

1. 系统基本信息获取

import rgf.win_def.*

// 获取当前进程ID
let processId = wGetCurrentProcessId()

// 获取当前线程ID  
let threadId = wGetCurrentThreadId()

// 获取系统版本信息(需要通过其他方式实现)

2. 内存信息获取

虽然RGF_CJ目前没有直接封装GlobalMemoryStatusEx函数,但我们可以通过其他方式获取内存信息:

// 获取系统内存信息(示例伪代码)
public func getMemoryInfo(): (total: UInt64, available: UInt64) {
    // 实际实现需要通过调用Windows API
    // 这里展示理想化的接口设计
    return (8589934592, 4294967296) // 8GB总内存,4GB可用
}

3. 显示设备信息

// 获取显示器信息
public func getDisplayInfo(): Array<MonitorInfo> {
    let monitors: Array<MonitorInfo> = []
    
    // 枚举显示器
    wEnumDisplayMonitors(null, null, { (hMonitor, hdc, lprc, dwData) =>
        let info = MONITORINFO()
        info.cbSize = sizeOf(MONITORINFO)
        if wGetMonitorInfoW(hMonitor, info) {
            monitors.push({
                handle: hMonitor,
                rect: info.rcMonitor,
                workArea: info.rcWork,
                isPrimary: (info.dwFlags & 1) != 0
            })
        }
        true
    }, 0)
    
    return monitors
}

完整的系统信息显示示例

下面是一个完整的示例,展示如何在RGF_CJ应用中获取并显示系统信息:

import rgf.rgf_core.*
import rgf.rgf_ui.*
import rgf.win_def.*
import rgf.rgf_utils.*

class SystemInfoWindow <: WinBase {
    let timer: RTimer
    let infoText: TextLayout
    
    rsConstructor() {
        // 创建定时器,每秒更新一次信息
        timer = RTimer(1000, { => updateSystemInfo() })
        
        // 创建文本布局用于显示信息
        infoText = TextLayout()
        infoText.setTextFormat(TextFormat("Consolas", 12))
    }
    
    func onPaint(surface: Surface) {
        // 绘制背景
        surface.clear(Color(240, 240, 240))
        
        // 绘制系统信息文本
        let brush = SolidColorBrush(Color(0, 0, 0))
        surface.drawTextLayout(infoText, 20, 20, brush)
    }
    
    func updateSystemInfo() {
        let info = StringBuilder()
        
        // 获取并格式化系统信息
        info.append("=== 系统信息 ===\n")
        info.append("进程ID: ").append(wGetCurrentProcessId().toString()).append("\n")
        info.append("线程ID: ").append(wGetCurrentThreadId().toString()).append("\n")
        
        // 获取内存信息(示例)
        let memInfo = getMemoryInfo()
        info.append("总内存: ").append(formatBytes(memInfo.total)).append("\n")
        info.append("可用内存: ").append(formatBytes(memInfo.available)).append("\n")
        
        // 获取显示器信息
        let displays = getDisplayInfo()
        info.append("显示器数量: ").append(displays.length.toString()).append("\n")
        for (i, display) in displays {
            info.append("显示器 ").append((i + 1).toString()).append(": ")
                .append(display.rect.width.toString()).append("x")
                .append(display.rect.height.toString())
            if display.isPrimary {
                info.append(" (主显示器)")
            }
            info.append("\n")
        }
        
        infoText.setText(info.toString())
        invalidate() // 触发重绘
    }
    
    func formatBytes(bytes: UInt64): String {
        let units = ["B", "KB", "MB", "GB", "TB"]
        var size = bytes.float64()
        var unitIndex = 0
        
        while size >= 1024 && unitIndex < units.length - 1 {
            size /= 1024
            unitIndex++
        }
        
        return size.toString("0.2f") + " " + units[unitIndex]
    }
}

// 主程序入口
rsMain(
    { =>
        let winClass = WinContext()
        rwRegister(winClass, "SystemInfoClass", 0)
        
        let mainWindow = SystemInfoWindow()
        mainWindow.createWin(winClass, "系统信息监控", 100, 100, 400, 300, null, 0)
        mainWindow.showWindow(1) // SW_SHOWNORMAL
    }
)

系统信息分类与获取策略

1. CPU信息获取

mermaid

2. 内存信息显示

// 内存信息数据结构
struct MemoryStatus {
    totalPhysical: UInt64
    availablePhysical: UInt64
    totalPageFile: UInt64
    availablePageFile: UInt64
    totalVirtual: UInt64
    availableVirtual: UInt64
    memoryLoad: UInt32
}

// 内存使用情况可视化
func drawMemoryUsage(surface: Surface, x: Int32, y: Int32, width: Int32, height: Int32, status: MemoryStatus) {
    // 绘制内存使用进度条
    let usagePercent = (status.totalPhysical - status.availablePhysical).float64() / status.totalPhysical.float64()
    
    // 背景
    surface.fillRectangle(Rect(x, y, width, height), SolidColorBrush(Color(200, 200, 200)))
    
    // 使用部分
    let usageWidth = (width.float64() * usagePercent).int32()
    surface.fillRectangle(Rect(x, y, usageWidth, height), SolidColorBrush(Color(0, 120, 215)))
    
    // 文本标签
    let text = "内存使用: " + (usagePercent * 100).toString("0.1f") + "%"
    surface.drawText(text, x, y - 20, SolidColorBrush(Color(0, 0, 0)), TextFormat("Arial", 12))
}

3. 磁盘信息获取

// 获取磁盘信息
public func getDiskInfo(): Array<DiskDrive> {
    let drives: Array<DiskDrive> = []
    let driveBits = wGetLogicalDrives()
    
    for i in 0..26 {
        if (driveBits & (1 << i)) != 0 {
            let driveLetter = Char(65 + i) + ":\\"
            let driveType = wGetDriveTypeW(driveLetter)
            
            if driveType > 1 { // 排除未知和不存在驱动器
                let freeBytes = getDiskFreeSpace(driveLetter)
                let totalBytes = getDiskTotalSpace(driveLetter)
                
                drives.push({
                    letter: driveLetter,
                    type: driveType,
                    freeSpace: freeBytes,
                    totalSpace: totalBytes,
                    label: getVolumeLabel(driveLetter)
                })
            }
        }
    }
    
    return drives
}

性能优化建议

1. 信息更新频率控制

// 智能更新策略
class SmartUpdater {
    let updateIntervals: Map<String, Int32> = {
        "cpu": 1000,      // CPU信息每秒更新
        "memory": 2000,   // 内存信息每2秒更新  
        "disk": 5000,     // 磁盘信息每5秒更新
        "network": 3000   // 网络信息每3秒更新
    }
    
    let lastUpdateTime: Map<String, Int64> = {}
    
    func shouldUpdate(infoType: String): Bool {
        let currentTime = getCurrentTime()
        let lastTime = lastUpdateTime.getOrDefault(infoType, 0)
        let interval = updateIntervals.get(infoType)
        
        if currentTime - lastTime >= interval {
            lastUpdateTime[infoType] = currentTime
            return true
        }
        return false
    }
}

2. 数据缓存机制

// 信息缓存类
class InfoCache<T> {
    let data: T
    let timestamp: Int64
    let validityPeriod: Int64
    
    rsConstructor(validityMs: Int64) {
        validityPeriod = validityMs
        timestamp = 0
    }
    
    func getData(fetcher: () -> T): T {
        let currentTime = getCurrentTime()
        if currentTime - timestamp > validityPeriod || timestamp == 0 {
            data = fetcher()
            timestamp = currentTime
        }
        return data
    }
    
    func isExpired(): Bool {
        return getCurrentTime() - timestamp > validityPeriod
    }
}

错误处理与兼容性

1. API调用异常处理

// 安全的系统信息获取
public func safeGetSystemInfo(): Result<SystemInfo, String> {
    try {
        let info = SystemInfo()
        // 调用系统API
        return Result.ok(info)
    } catch (e: Exception) {
        logError("获取系统信息失败: " + e.getMessage())
        return Result.err("无法获取系统信息")
    }
}

2. 版本兼容性处理

// 版本适配检查
public func checkFeatureSupport(feature: String): Bool {
    let version = getOsVersion()
    
    when (feature) {
        "memory_status_ex" -> return version >= Version(5, 1) // Windows XP+
        "multi_monitor" -> return version >= Version(5, 0)    // Windows 2000+
        "disk_space_ex" -> return version >= Version(5, 0)    // Windows 2000+
        else -> return false
    }
}

可视化展示最佳实践

1. 信息面板布局设计

mermaid

2. 实时监控界面示例

// 实时监控面板
class MonitoringDashboard <: WinBase {
    let cpuChart: LineChart
    let memoryGauge: CircularGauge
    let diskBars: Array<ProgressBar>
    let networkMeters: Array<ValueMeter>
    
    rsConstructor() {
        // 初始化各种监控组件
        cpuChart = LineChart()
        memoryGauge = CircularGauge()
        // ... 其他组件初始化
    }
    
    func onPaint(surface: Surface) {
        // 绘制仪表盘布局
        drawDashboardLayout(surface)
        
        // 更新并绘制各个监控组件
        updateCpuChart()
        updateMemoryGauge()
        updateDiskBars()
        updateNetworkMeters()
    }
    
    func drawDashboardLayout(surface: Surface) {
        // 绘制网格布局
        let gridWidth = width / 2
        let gridHeight = height / 2
        
        // 第一行
        cpuChart.draw(surface, 0, 0, gridWidth, gridHeight)
        memoryGauge.draw(surface, gridWidth, 0, gridWidth, gridHeight)
        
        // 第二行
        // ... 其他组件绘制
    }
}

总结

通过RGF_CJ框架,开发者可以轻松获取和显示Windows系统的各种硬件信息。本文介绍了:

  1. 核心API使用:通过rgf.win_def包调用系统级API
  2. 信息分类获取:CPU、内存、磁盘、显示器等关键信息的获取方法
  3. 可视化展示:如何将获取的信息优雅地呈现在用户界面中
  4. 性能优化:通过缓存和智能更新策略提升应用性能
  5. 错误处理:确保在各种系统环境下都能稳定运行

RGF_CJ提供了强大的基础设施,结合良好的架构设计,可以构建出功能丰富、性能优异的系统监控应用。开发者可以根据实际需求,选择合适的信息获取频率和展示方式,创建出用户体验优秀的系统工具。

记住,系统信息获取不仅要准确,还要考虑性能和资源消耗。合理的设计和优化能够让应用在提供丰富功能的同时,保持流畅的用户体验。

【免费下载链接】RGF_CJ RGF是Windows系统下的通用渲染框架,其基于Direct3D、Direct2D、DXGI、DirectWrite、WIC、GDI、GDIplus等技术开发。RGF仓颉版(后续简称"RGF")基于RGF(C/C++版)封装优化而来。RGF为开发者提供轻量化、安全、高性能以及高度一致性的2D渲染能力,并且提供对接Direct3D的相关接口,以满足开发者对3D画面渲染的需求。 【免费下载链接】RGF_CJ 项目地址: https://gitcode.com/Cangjie-SIG/RGF_CJ

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值