C# WindowsAPI

来源:http://www.cnblogs.com/BookCode/archive/2016/03/26/5324072.html
-Advertisement-
Play Games

Windows是一個強大的操作系統,也會向開發者提供海量的系統API來幫助開發者來完成Windows系統軟體的開發工作。 整理的部分Windows API,C#可以直接調用。 1.獲取.exe應用程式的圖標 2.獲取硬碟信息 3.開機啟動程式 4.系統熱鍵操作 5.系統進程操作 6.改變視窗 ...


Windows是一個強大的操作系統,也會向開發者提供海量的系統API來幫助開發者來完成Windows系統軟體的開發工作。

整理的部分Windows API,C#可以直接調用。

1.獲取.exe應用程式的圖標

1 [DllImport("shell32.DLL", EntryPoint = "ExtractAssociatedIcon")]  
2 private static extern int ExtractAssociatedIconA(int hInst, string lpIconPath, ref int lpiIcon); //聲明函數  
3    System.IntPtr thisHandle;  
4    public System.Drawing.Icon GetIco(string filePath)//filePath是要獲取文件路徑,返回ico格式文件  
5    {  
6        int RefInt = 0;  
7        thisHandle = new IntPtr(ExtractAssociatedIconA(0, filePath, ref RefInt));  
8        return System.Drawing.Icon.FromHandle(thisHandle);  
9    }

2.獲取硬碟信息

public string GetComputorInformation()  
       {  
              
               StringBuilder mStringBuilder = new StringBuilder();  
               DriveInfo[] myAllDrivers = DriveInfo.GetDrives();  
               try  
               {  
                   foreach (DriveInfo myDrive in myAllDrivers)  
                   {  
                       if (myDrive.IsReady)  
                       {  
                           mStringBuilder.Append("磁碟驅動器盤符:");  
                           mStringBuilder.AppendLine(myDrive.Name);  
                           mStringBuilder.Append("磁碟捲標:");  
                           mStringBuilder.AppendLine(myDrive.VolumeLabel);  
                           mStringBuilder.Append("磁碟類型:");  
                           mStringBuilder.AppendLine(myDrive.DriveType.ToString());  
                           mStringBuilder.Append("磁碟格式:");  
                           mStringBuilder.AppendLine(myDrive.DriveFormat);  
                           mStringBuilder.Append("磁碟大小:");  
                           decimal resultmyDrive = Math.Round((decimal)myDrive.TotalSize / 1024 / 1024 / 1024, 2);  
                           mStringBuilder.AppendLine(resultmyDrive "GB");  
                           mStringBuilder.Append("剩餘空間:");  
                           decimal resultAvailableFreeSpace = Math.Round((decimal)myDrive.AvailableFreeSpace / 1024 / 1024 / 1024, 2);  
                           mStringBuilder.AppendLine(resultAvailableFreeSpace "GB");  
                           mStringBuilder.Append("總剩餘空間(含磁碟配額):");  
                           decimal resultTotalFreeSpace = Math.Round((decimal)myDrive.TotalFreeSpace / 1024 / 1024 / 1024, 2);  
                           mStringBuilder.AppendLine(resultTotalFreeSpace "GB");  
                           mStringBuilder.AppendLine("-------------------------------------");  
                       }  
                   }  
                    
               }  
               catch (Exception ex)  
               {  
                   throw ex;  
               }  
   
               return mStringBuilder.ToString();  
       }

3.開機啟動程式

//獲取註冊表中的啟動位置  
        RegistryKey RKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);  
        ///<summary>/// 設置開機啟動  
        ///</summary>///<param name="path"/>public void StartRunApp(string path)  
        {  
            string strnewName = path.Substring(path.LastIndexOf("\\") 1);//要寫入註冊表的鍵值名稱  
            if (!File.Exists(path))//判斷指定的文件是否存在  
                return;  
            if (RKey == null)  
            {  
                RKey = Registry.LocalMachine.CreateSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");  
            }  
            RKey.SetValue(strnewName, path);//通過修改註冊表,使程式在開機時自動運行  
        }  
        ///<summary>/// 取消開機啟動  
        ///</summary>///<param name="path"/>public void ForbitStartRun(string path)  
        {  
            string strnewName = path.Substring(path.LastIndexOf("\\") 1);//要寫入註冊表的鍵值名稱  
            RKey.DeleteValue(strnewName, false);//通過修改註冊表,取消程式在開機時自動運行  
        }

4.系統熱鍵操作

[DllImport("user32.dll")] //聲明api函數  
       public static extern bool RegisterHotKey(  
        IntPtr hwnd, // 視窗句柄  
        int id, // 熱鍵ID  
        uint fsmodifiers, // 熱鍵修改選項   
        Keys vk // 熱鍵  
       );  
       [DllImport("user32.dll")] //聲明api函數  
       public static extern bool UnregisterHotKey(  
        IntPtr hwnd, // 視窗句柄   
        int id // 熱鍵ID   
       );  
       public enum keymodifiers //組合鍵枚舉  
       {  
           none = 0,  
           alt = 1,  
           control = 2,  
           shift = 4,  
           windows = 8  
       }  
       private void processhotkey(Message m) //按下設定的鍵時調用該函數  
       {  
           IntPtr id = m.WParam; //intptr用於表示指針或句柄的平臺特定類型  
           //messagebox.show(id.tostring());  
           string sid = id.ToString();  
           switch (sid)  
           {  
               case "100":  
   
                   break;  
               case "200":  
   
                   break;  
           }  
       }  
       ///<summary>/// 註冊熱鍵  
       ///</summary>public void RegisterHotkey(IntPtr handle, int hotkeyID, uint fsmodifiers, Keys mKeys)  
       {  
           RegisterHotKey(handle, hotkeyID, fsmodifiers, mKeys);  
       }  
   
       ///<summary>/// 卸載熱鍵  
       ///</summary>///<param name="handle"/>///<param name="hotkeyID"/>public void UnregisterHotkey(IntPtr handle, int hotkeyID)  
       {  
           UnregisterHotKey(handle, hotkeyID);  
       }

5.系統進程操作

public class GetProcess  
    {  
        bool isSuccess = false;  
        [DllImport("kernel32")]  
        public static extern void GetWindowsDirectory(StringBuilder WinDir, int count);  
        [DllImport("kernel32")]  
        public static extern void GetSystemDirectory(StringBuilder SysDir, int count);  
        [DllImport("kernel32")]  
        public static extern void GetSystemInfo(ref CPU_INFO cpuinfo);  
        [DllImport("kernel32")]  
        public static extern void GlobalMemoryStatus(ref MEMORY_INFO meminfo);  
        [DllImport("kernel32")]  
        public static extern void GetSystemTime(ref SYSTEMTIME_INFO stinfo);  
   
        //定義CPU的信息結構  
        [StructLayout(LayoutKind.Sequential)]  
        public struct CPU_INFO  
        {  
            public uint dwOemId;  
            public uint dwPageSize;  
            public uint lpMinimumApplicationAddress;  
            public uint lpMaximumApplicationAddress;  
            public uint dwActiveProcessorMask;  
            public uint dwNumberOfProcessors;  
            public uint dwProcessorType;  
            public uint dwAllocationGranularity;  
            public uint dwProcessorLevel;  
            public uint dwProcessorRevision;  
        }  
   
        //定義記憶體的信息結構  
        [StructLayout(LayoutKind.Sequential)]  
        public struct MEMORY_INFO  
        {  
            public uint dwLength;  
            public uint dwMemoryLoad;  
            public uint dwTotalPhys;  
            public uint dwAvailPhys;  
            public uint dwTotalPageFile;  
            public uint dwAvailPageFile;  
            public uint dwTotalVirtual;  
            public uint dwAvailVirtual;  
        }  
   
        //定義系統時間的信息結構  
        [StructLayout(LayoutKind.Sequential)]  
        public struct SYSTEMTIME_INFO  
        {  
            public ushort wYear;  
            public ushort wMonth;  
            public ushort wDayOfWeek;  
            public ushort wDay;  
            public ushort wHour;  
            public ushort wMinute;  
            public ushort wSecond;  
            public ushort wMilliseconds;  
        }  
   
        public string GetSystemInformation()  
        {  
            MEMORY_INFO MemInfo = new MEMORY_INFO();  
            GlobalMemoryStatus(ref MemInfo);  
            return MemInfo.dwMemoryLoad.ToString();  
        }  
   
        public string GetSystemCup()  
        {  
            CPU_INFO CpuInfo = new CPU_INFO();  
            GetSystemInfo(ref CpuInfo);  
            return CpuInfo.dwProcessorType.ToString();  
       }  
   
        ///<summary>/// 獲取當前所有進程  
        ///</summary>///<returns></returns>public DataTable GetAllProcess()  
        {  
            DataTable mDataTable = new DataTable();  
            mDataTable.Rows.Clear();  
            mDataTable.Columns.Add("ProcessID");  
            mDataTable.Columns.Add("ProcessName");  
            mDataTable.Columns.Add("Memory");  
            mDataTable.Columns.Add("StartTime");  
            mDataTable.Columns.Add("FileName");  
            mDataTable.Columns.Add("ThreadNumber");  
   
            Process[] myProcess = Process.GetProcesses();  
            foreach (Process p in myProcess)  
            {  
                DataRow mDataRow = mDataTable.NewRow();  
                mDataRow[0] = p.Id;  
                mDataRow[1] = p.ProcessName;  
                mDataRow[2] = string.Format("{0:###,##0.00}KB", p.PrivateMemorySize64 / 1024);  
                //有些進程無法獲取啟動時間和文件名信息,所以要用try/catch;  
                try  
                {  
                    mDataRow[3] = string.Format("{0}", p.StartTime);  
                    mDataRow[4] = p.MainModule.FileName;  
                    mDataRow[5] = p.Threads.Count;  
   
                }  
                catch  
                {  
                    mDataRow[3] = "";  
                    mDataRow[4] = "";  
   
                }  
                mDataTable.Rows.Add(mDataRow);  
            }  
            return mDataTable;  
        }  
   
        ///<summary>/// 結束進程  
        ///</summary>///<param name="processName"/>///<returns></returns>public bool KillProcess(string processName)  
        {  
            try  
            {  
                System.Diagnostics.Process[] process = System.Diagnostics.Process.GetProcessesByName(processName);  
                foreach (System.Diagnostics.Process p in process)  
                {  
                    p.Kill();  
                }  
            }  
            catch  
            {  
                isSuccess = false;  
            }  
            return isSuccess;  
        }  
    }

6.改變視窗

public const int SE_SHUTDOWN_PRIVILEGE = 0x13;  
   
       [DllImport("user32.dll")]  
       public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);  
   
       [DllImport("user32.dll")]  
       public static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);  
   
       [DllImport("user32.dll")]  
       public static extern bool SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int X, int Y, int cx,  
           int cy, uint uFlags);

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 寫ASP.NET MVC程式,我們經常需要把數據從視圖(View)傳遞至部分視圖(Partial View) 或者相反。今天Insus.NET使用 ControllerBase.TempData 進行處理。 首先演示的是View至Parital View創建一個控制器,並添加一個操作TmTestA( ...
  • http://www.codeproject.com/Articles/26466/Dependency-Injection-using-Spring-NET http://stackoverflow.com/questions/29767825/spring-netnhibernate-confi ...
  • 在項目中,採用code first時建立的模型對象不能直接用於數據傳輸,需要從新根據需求建立Dto對象 為什麼需要建立Dto對象呢? 那麼在項目中需要將Model轉換成DTO,為了快速方便的轉換,可以採用Lambda Expression快速實現, 例如,建立了領域模型Book 建立DTO對象 建立 ...
  • 什麼是WCF Windows Communication Foundation(WCF)是由微軟開發的一系列支持數據通信的應用程式框架,可以翻譯為Windows 通訊開發平臺。 整合了原有的windows通訊的 .net Remoting,WebService,Socket的機制,並融合有Http和 ...
  • 01.什麼是三層架構 01.表示層(User Interface layer):負責接收用戶的輸入,將輸出呈現給用戶,以及訪問安全性驗證,並對輸入的數據的正確性,有效性及呈現樣式負責,但對輸出的數據的正確性不負責。 02.業務邏輯層(Business Logic Layer):負責系統領域業務的處理 ...
  • 一、預編譯的優點 1. 由於頁和代碼文件在第一次被請求時無需編譯,因此可以縮短對用戶的響應時間。這對於更新頻繁的大型網站尤為有用 2. 可以在用戶看到網站之前識別編譯時的 Bug 3. 可以創建站點的已編譯版本,並將該版本部署到成品伺服器,而無需使用源代碼 二、就地預編譯與針對部署的預編譯 1. 就 ...
  • 問題背景:如果使用plsql等工具可以連接Oralce說明與Oralce安裝無關。 VS連接資料庫時提示“ORA-12154: TNS: 無法解析指定的連接標識符”的解決方法 解決步驟: 1、去網上下載“instantclient-basic-win32-11.2.0.1.0.zip”,名稱為ins ...
  • 其實很早之前我就已經瞭解了在winform下實現插件編程,原理很簡單,主要實現思路就是:先定一個插件介面作為插件樣式及功能的約定,然後具體的插件就去實現這個插件介面,最後宿主(應用程式本身)就利用反射動態獲取實現了插件介面的類型作為合法的插件,從而完成動態載入及宿主與插件之間的互動。因為之前一段時間 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...