C# 實現系統信息監控與獲取全解析

在 C# 開發的眾多應用場景中,獲取系統信息以及監控用戶操作有著廣泛的用途。比如在系統性能優化工具中,需要實時讀取 CPU、GPU 資源信息;在一些特殊的輸入記錄程序里,可能會涉及到鍵盤監控;而在圖形界面開發中,獲取屏幕大小是基礎操作。本文將詳細介紹如何使用 C# 來實現這些功能,助力大家在開發中更好地與系統底層進行交互。

一、C# 監控鍵盤

1. 原理與實現思路

在 Windows 系統下,可以通過 Windows API 來實現鍵盤監控。需要使用SetWindowsHookEx函數來設置一個鉤子,當鍵盤事件發生時,系統會調用我們定義的回調函數來處理這些事件。

2. 代碼實現

首先,需要引入System.Runtime.InteropServices命名空間,以便調用 Windows API。


using System;using System.Runtime.InteropServices;class KeyboardMonitor{// 定義委托類型private delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam);// 定義鉤子句柄private static IntPtr hHook = IntPtr.Zero;// 導入SetWindowsHookEx函數[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]private static extern IntPtr SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hMod, uint dwThreadId);// 導入UnhookWindowsHookEx函數[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)][return: MarshalAs(MarshalType.Bool)]private static extern bool UnhookWindowsHookEx(IntPtr hhk);// 導入CallNextHookEx函數[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);// 導入GetModuleHandle函數[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]private static extern IntPtr GetModuleHandle(string lpModuleName);// 定義鉤子類型private const int WH_KEYBOARD_LL = 13;// 定義鍵盤消息常量private const int WM_KEYDOWN = 0x0100;private const int WM_KEYUP = 0x0101;// 定義回調函數private static IntPtr KeyboardHookProc(int nCode, IntPtr wParam, IntPtr lParam){if (nCode >= 0){if (wParam == (IntPtr)WM_KEYDOWN || wParam == (IntPtr)WM_KEYUP){int vkCode = Marshal.ReadInt32(lParam);Console.WriteLine($"鍵盤事件: {(wParam == (IntPtr)WM_KEYDOWN? "按下" : "松開")},鍵碼: {vkCode}");}}return CallNextHookEx(hHook, nCode, wParam, lParam);}// 安裝鉤子public static void StartMonitoring(){using (System.Diagnostics.Process curProcess = System.Diagnostics.Process.GetCurrentProcess())using (System.Diagnostics.ProcessModule curModule = curProcess.MainModule){hHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHookProc, GetModuleHandle(curModule.ModuleName), 0);if (hHook == IntPtr.Zero){Console.WriteLine("設置鉤子失敗。");}}}// 卸載鉤子public static void StopMonitoring(){if (hHook!= IntPtr.Zero){UnhookWindowsHookEx(hHook);hHook = IntPtr.Zero;}}}

在Main方法中可以調用KeyboardMonitor.StartMonitoring()來開始監控鍵盤,調用KeyboardMonitor.StopMonitoring()停止監控。

二、讀取 CPU、GPU 資源信息

1. 使用 PerformanceCounter 讀取 CPU 信息

PerformanceCounter類是.NET 框架提供的用于讀取系統性能計數器的工具。通過它可以方便地獲取 CPU 使用率等信息。


using System;using System.Diagnostics;class CpuMonitor{private PerformanceCounter cpuCounter;public CpuMonitor(){cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total");}public float GetCpuUsage(){return cpuCounter.NextValue();}}

在Main方法中使用如下:


CpuMonitor cpuMonitor = new CpuMonitor();while (true){float cpuUsage = cpuMonitor.GetCpuUsage();Console.WriteLine($"當前CPU使用率: {cpuUsage}%");System.Threading.Thread.Sleep(1000);}

2. 使用第三方庫讀取 GPU 信息

讀取 GPU 信息相對復雜一些,通常需要借助第三方庫,比如OpenHardwareMonitor。首先通過 NuGet 安裝OpenHardwareMonitor庫。


using OpenHardwareMonitor.Hardware;using System;class GpuMonitor{private Computer computer;public GpuMonitor(){computer = new Computer();computer.GPUEnabled = true;computer.Open();}public void PrintGpuInfo(){foreach (IHardware hardware in computer.Hardware){if (hardware.HardwareType == HardwareType.GpuNvidia || hardware.HardwareType == HardwareType.GpuAmd){hardware.Update();foreach (ISensor sensor in hardware.Sensors){if (sensor.SensorType == SensorType.Load){Console.WriteLine($"GPU負載: {sensor.Value}%");}else if (sensor.SensorType == SensorType.Temperature){Console.WriteLine($"GPU溫度: {sensor.Value}℃");}}}}}~GpuMonitor(){computer.Close();}}

在Main方法中調用:

 
GpuMonitor gpuMonitor = new GpuMonitor();gpuMonitor.PrintGpuInfo();

三、獲取屏幕大小

在 C# 中,可以使用System.Windows.Forms.Screen類來獲取屏幕相關信息,包括屏幕大小。


using System;using System.Windows.Forms;class ScreenInfo{public static void GetScreenSize(){Screen primaryScreen = Screen.PrimaryScreen;Console.WriteLine($"屏幕寬度: {primaryScreen.Bounds.Width} 像素");Console.WriteLine($"屏幕高度: {primaryScreen.Bounds.Height} 像素");}}

在Main方法中調用ScreenInfo.GetScreenSize()即可獲取屏幕大小信息。

四、總結

通過以上方法,我們利用 C# 實現了監控鍵盤、讀取 CPU 和 GPU 資源信息以及獲取屏幕大小的功能。這些功能在系統性能分析、特殊輸入處理以及圖形界面適配等方面都有著重要的應用。在實際開發中,大家可以根據具體需求對這些功能進行拓展和優化。如果在實踐過程中遇到問題或者有更好的實現思路,歡迎在評論區交流分享。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/66501.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/66501.shtml
英文地址,請注明出處:http://en.pswp.cn/web/66501.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用docker-compose安裝ELK(elasticsearch,logstash,kibana)并簡單使用

首先服務器上需要安裝docker已經docker-compose,如果沒有,可以參考我之前寫的文章進行安裝。 https://blog.csdn.net/a_lllk/article/details/143382884?spm1001.2014.3001.5502 1.下載并啟動elk容器 先創建一個網關,讓所有的容器共用此網…

二十四、NetworkPolicy

NetworkPolicy 一、基礎網路 Kubernetes網絡模型設計的一個基礎原則是:每個Pod都擁有一個獨立的IP地址,并假定所有Pod都在一個可以直接連通的、扁平的網絡空間中。所以不管它們是否運行在同一個Node(宿主機)中,都要求它們可以直接通過對方的IP進行訪問。設計這個原則的原…

Python Web應用開發入門:從零搭建一個簡單的Web應用

引言 在當今的互聯網時代,Web應用已經成為我們日常生活中不可或缺的一部分。無論是社交媒體、電子商務,還是在線教育,Web應用都在背后發揮著重要作用。Python作為一種簡潔、強大的編程語言,在Web開發領域也有著廣泛的應用。本文將帶你從零開始,使用Python搭建一個簡單的W…

Java操作Excel導入導出——POI、Hutool、EasyExcel

目錄 一、POI導入導出 1.數據庫導出為Excel文件 2.將Excel文件導入到數據庫中 二、Hutool導入導出 1.數據庫導出為Excel文件——屬性名是列名 2.數據庫導出為Excel文件——列名起別名 3.從Excel文件導入數據到數據庫——屬性名是列名 4.從Excel文件導入數據到數據庫…

下載文件,瀏覽器阻止不安全下載

背景: 在項目開發中,遇到需要下載文件的情況,文件類型可能是圖片、excell表、pdf、zip等文件類型,但瀏覽器會阻止不安全的下載鏈接。 效果展示: 下載文件的兩種方式: 一、根據接口的相對url,拼…

第15章:Python TDD應對貨幣類開發變化(二)

寫在前面 這本書是我們老板推薦過的,我在《價值心法》的推薦書單里也看到了它。用了一段時間 Cursor 軟件后,我突然思考,對于測試開發工程師來說,什么才更有價值呢?如何讓 AI 工具更好地輔助自己寫代碼,或許…

CSS 動畫相關屬性

定義和用法 一些 CSS 屬性可用于動畫制作,這意味著它們可用于過渡等效果中。 可設置動畫的屬性可以從一個值逐漸更改為另一個值,例如尺寸、數字、百分比和顏色。 瀏覽器支持 表格中的數字注明了完全支持 CSS 動畫的首個瀏覽器版本。 -webkit-、-moz…

SD/MMC驅動開發

一、介紹 MMC的全稱是”MultiMediaCard”――所以也通常被叫做”多媒體卡”,是一種小巧大容量的快閃存儲卡,特別應用于移動電話和數字影像及其他移動終端中。MMC存貯卡只有7pin,可以支持MMC和SPI兩種工作模式。 SD卡,數字安全記憶卡&#xf…

Elasticsearch:Jira 連接器教程第一部分

作者:來自 Elastic Gustavo Llermaly 將我們的 Jira 內容索引到 Elaasticsearch 中以創建統一的數據源并使用文檔級別安全性進行搜索。 在本文中,我們將回顧 Elastic Jira 原生連接器的一個用例。我們將使用一個模擬項目,其中一家銀行正在開發…

《探索煙霧目標檢測開源項目:技術與應用的深度剖析》

一、引言 在現代社會,火災猶如高懸的達摩克利斯之劍,時刻威脅著人們的生命財產安全。煙霧,作為火災發生的重要征兆,其及時、準確的檢測對于火災預防和控制起著舉足輕重的作用。煙霧目標檢測技術猶如敏銳的 “電子哨兵”&#xff…

Linux操作系統的靈魂,深度解析MMU內存管理

在計算機的奇妙世界里,我們每天使用的操作系統看似流暢自如地運行著各類程序,背后實則有著一位默默耕耘的 “幕后英雄”—— 內存管理單元(MMU)。它雖不常被大眾所熟知,卻掌控著計算機內存的關鍵命脈,是保障…

3.2 OpenAI 語言模型總覽:GPT 系列的演進與應用解析

OpenAI 語言模型總覽:GPT 系列的演進與應用解析 OpenAI 的語言模型,特別是 GPT(Generative Pre-trained Transformer)系列,代表了當前自然語言處理(NLP)技術的前沿。自從推出以來,這些模型不斷推進了文本生成、理解和交互的能力,成為了多個應用場景中的核心技術。本文…

【云嵐到家】-day02-客戶管理-認證授權

第二章 客戶管理 1.認證模塊 1.1 需求分析 1.基礎概念 一般情況有用戶交互的項目都有認證授權功能,首先我們要搞清楚兩個概念:認證和授權 認證: 就是校驗用戶的身份是否合法,常見的認證方式有賬號密碼登錄、手機驗證碼登錄等 授權:則是該用…

Thinkphp8 Apidoc 實際使用中遇到的問題解決

1. 接口去掉 Controller 問題: 正確的路徑應該是/api/login/register, 這塊controller有沒有地方配置的? 2. 自定義成功,錯誤消息有沒有辦法? 未完成, 待更新

2024春秋杯密碼題第一、二天WP

你是小哈斯? 題目內容: 年輕黑客小符參加CTF大賽,他發現這個小哈斯文件的內容存在高度規律性,并且文件名中有隱藏信息,他成功找到了隱藏的信息,并破解了挑戰。得意地說:“成功在于探索與質疑&#xff0c…

opencv對直方圖的計算和繪制

【歡迎關注編碼小哥,學習更多實用的編程方法和技巧】 1、直方圖的計算 cv::calcHist 是 OpenCV 中用于計算圖像直方圖的函數。它可以處理多通道圖像,并通過指定圖像、通道、掩膜、直方圖大小和范圍等參數來生成直方圖。 函數原型 void cv::calcHist(…

C++的auto_ptr智能指針:從誕生到被棄用的歷程

C作為一種功能強大的編程語言,為開發者提供了眾多便捷的特性和工具,其中智能指針是其重要特性之一。智能指針能夠自動管理內存,有效避免內存泄漏等常見問題。然而,并非所有智能指針都盡善盡美,auto_ptr便是其中的一個例…

游戲開發中常用的設計模式

目錄 前言一、工廠模式二、單例模式三、觀察者模式觀察者模式的優勢 四、狀態模式狀態模式的優勢 五、策略模式策略模式的優勢策略模式與狀態模式有什么區別呢? 六、組合模式七、命令模式八、裝飾器模式 前言 本文介紹了游戲開發中常用的設計模式,如工廠模式用于創…

C++并發編程之異常安全性增強

在并發編程中,異常安全是一個非常重要的方面,因為并發環境下的錯誤處理比單線程環境更加復雜。當多個線程同時執行時,異常不僅可能影響當前線程,還可能影響其他線程和整個程序的穩定性。以下是一些增強并發程序異常安全性的方法&a…

各語言鏡像配置匯總

鏡像配置匯總 Nodejs [ npm ]Python [ pip ] Nodejs [ npm ] // # 記錄日期:2025-01-20// 查詢當前使用的鏡像 npm get registry// 設置淘寶鏡像 npm config set registry https://registry.npmmirror.com/// 恢復為官方鏡像 npm config set registry https://regi…