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信息获取
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. 信息面板布局设计
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系统的各种硬件信息。本文介绍了:
- 核心API使用:通过
rgf.win_def包调用系统级API - 信息分类获取:CPU、内存、磁盘、显示器等关键信息的获取方法
- 可视化展示:如何将获取的信息优雅地呈现在用户界面中
- 性能优化:通过缓存和智能更新策略提升应用性能
- 错误处理:确保在各种系统环境下都能稳定运行
RGF_CJ提供了强大的基础设施,结合良好的架构设计,可以构建出功能丰富、性能优异的系统监控应用。开发者可以根据实际需求,选择合适的信息获取频率和展示方式,创建出用户体验优秀的系统工具。
记住,系统信息获取不仅要准确,还要考虑性能和资源消耗。合理的设计和优化能够让应用在提供丰富功能的同时,保持流畅的用户体验。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



