C# Windows API

API:应用程序接口(API:Application Program Interface)
应用程序接口(API:application programming interface)是一组定义、程序及协议的集合,通过 API 接口实现计算机软件之间的相互通信。API 的一个主要功能是提供通用功能集。程序员通过使用 API 函数开发应用程序,从而可以避免编写无用程序,以减轻编程任务。 
API 同时也是一种中间件,为各种不同平台提供数据共享。根据单个或分布式平台上不同软件应用程序间的数据共享性能,可以将 API 分为四种类型:

远程过程调用(RPC):通过作用在共享数据缓存器上的过程(或任务)实现程序间的通信。 
标准查询语言(SQL):是标准的访问数据的查询语言,通过通用数据库实现应用程序间的数据共享。 
文件传输:文件传输通过发送格式化文件实现应用程序间数据共享。 
信息交付:指松耦合或紧耦合应用程序间的小型格式化信息,通过程序间的直接通信实现数据共享。
当前应用于 API 的标准包括 ANSI 标准 SQL API。另外还有一些应用于其它类型的标准尚在制定之中。API 可以应用于所有计算机平台和操作系统。这些 API 以不同的格式连接数据(如共享数据缓存器、数据库结构、文件框架)。每种数据格式要求以不同的数据命令和参数实现正确的数据通信,但同时也会产生不同类型的错误。因此,除了具备执行数据共享任务所需的知识以外,这些类型的 API 还必须解决很多网络参数问题和可能的差错条件,即每个应用程序都必须清楚自身是否有强大的性能支持程序间通信。相反由于这种 API 只处理一种信息格式,所以该情形下的信息交付 API 只提供较小的命令、网络参数以及差错条件子集。正因为如此,交付 API 方式大大降低了系统复杂性,所以当应用程序需要通过多个平台实现数据共享时,采用信息交付 API 类型是比较理想的选择。

API 与图形用户接口(GUI)或命令接口有着鲜明的差别:API 接口属于一种操作系统或程序接口,而后两者都属于直接用户接口。

有时公司会将 API 作为其公共开放系统。也就是说,公司制定自己的系统接口标准,当需要执行系统整合、自定义和程序应用等操作时,公司所有成员都可以通过该接口标准调用源代码,该接口标准被称之为开放式 API。

Windows是一个强大的操作系统,也会向开发者提供海量的系统API来帮助开发者来完成Windows系统软件的开发工作。在此,向大家分享一下自己以前用到过的,整理的部分Windows API,C#可以直接调用。

1.获取.exe应用程序的图标

[DllImport("shell32.DLL", EntryPoint = "ExtractAssociatedIcon")]
private static extern int ExtractAssociatedIconA(int hInst, string lpIconPath, ref int lpiIcon); //声明函数
   System.IntPtr thisHandle;
   public System.Drawing.Icon GetIco(string filePath)//filePath是要获取文件路径,返回ico格式文件
   {
       int RefInt = 0;
       thisHandle = new IntPtr(ExtractAssociatedIconA(0, filePath, ref RefInt));
       return System.Drawing.Icon.FromHandle(thisHandle);
   }

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);
时间: 2024-11-07 12:30:53

C# Windows API的相关文章

Windows API 编程学习记录&lt;二&gt;

恩,开始写Windows API编程第二节吧. 上次介绍了几个关于Windows API编程最基本的概念,但是如果只是看这些概念,估计还是对Windows API不是很了解.这节我们就使用Windows API 让大家来了解下Windows API的用法. 第一个介绍的Windows API 当然是最经典的MessageBox,这个API 的作用就是在电脑上显示一个对话框,我们先来看看这个API的定义吧: int WINAPI MessageBox(HWND hWnd, LPCTSTR lpTe

Windows API 编程学习记录&lt;三&gt;

恩,开始写API编程的第三节,其实马上要考试了,但是不把这节写完,心里总感觉不舒服啊.写完赶紧去复习啊       在前两节中,我们介绍了Windows API 编程的一些基本概念和一个最基本API函数 MessageBox的使用,在这节中,我们就来正式编写一个Windows的窗口程序. 在具体编写代码之前,我们必须先要了解一下API 编写窗口程序具体的三个基本步骤:             1. 注册窗口类:             2.创建窗口:             3.显示窗口: 恩,

WinSpy涉及的windows api

WinSpy涉及的windows api WinSpy是仿造微软Spy++的开源项目,但只涉及Spy++的窗口句柄.窗口的属性.styles.类名子窗口.进程线程信息等查找功能.功能虽然不算强大,但涉及到很多windows api,是了解windows api的一个有用工具.WinSpy界面截图如下: 1:拖拽瞄准镜图标获取窗口的HWND 核心api:ClientToScreen.WindowFromPoint.EnumChildWindows.GetParent.GetWindowLong.S

Delphi Windows API判断文件共享锁定状态

一.概述 锁是操作系统为实现数据共享而提供的一种安全机制,它使得不同的应用程序,不同的计算机之间可以安全有效地共享和交换数据.要保证安全有效地操作共享数据,必须在相应的操作前判断锁的类型,然后才能确定数据是否可读或可写,从而为开发出健壮的程序提供切实依据.   同样,在Windows中,文件可以共享模式打开,它也涉及到锁的操作问题.根据Windows中文件共享时加锁范围的大小,锁可分为全局锁和局部锁:全局锁以锁定文件全部内容为特征,而局部锁以锁定文件的局部内容为特征,且文件的锁定区域不可重复.根

Windows API所提供的功能可以归为七类

1.基础服务(Base Services),提供对Windows系统可用的基础资源的访问接口.比如象:文件系统(file system).外部设备(device).,进程(process).线程(thread)以及访问注册表(Windows registry)和错误处理机制(error handling).这些功能接口位于,16位Windows下的kernel.exe.krnl286.exe或krnl386.exe系统文档中:以及32位Windows下的 kernel32.dll和advapi3

Windows API的消息处理机制

上个学期找实习失利,让我觉得自己基础打得不够牢固,所以在华为实习的这三个月里,每天下班都在复习理论课的知识,顺便刷了一个月的 LeetCode.本来以为找工作是势在必得了,结果这个学期秋季校招的坑爹经历导致现在还没有拿到一家公司的 offer.华为实习一结束,回学校的第二天就去参加了 360 在广州的笔试,进了面试以后却又喜闻乐见地一面就被干掉了.再加上之前 milo yip 大大对我提的建议,思来想去,感觉还是自己的简历不够拿得出手.现在开始都没剩下几家想进的公司了,为了不失业只能提早为明年的

Windows API 教程(七) hook 钩子监听

Windows API 教程(七) hook 钩子监听 Posted on 2013-08-15 茵蒂克丝 如何创建一个窗口 手动创建窗口的流程 实际代码 安装钩子 (Install hook) 钩子简介 SetWindowsHookEx 函数 设置监听[键盘]消息 设置监听[鼠标]消息 如何创建一个窗口 另外一个再录的 Windows SDK教程 里面有讲到快捷创建窗口的方式,不过这样的话要分好几个文件,感觉有点混所以这里就用原始的方式创建一个窗口. 那么,为什么讲到 hook(钩子)的时候要

VC Windows API获得桌面所有窗口句柄的方法

VC Windows API应用之GetDesktopWindow ——获得桌面所有窗口句柄的方法 Windows API Windows 这个多作业系统除了协调应用程序的执行.分配内存.管理资源…之外, 它同时也是一个很大的服务中心,调用这个服务中心的各种服务(每一种服务就是一个函数),可以帮应用程式达到开启视窗.描绘图形.使用周边设备等目的,由于这些函数服务的对象是应用程序(Application), 所以便称之为 Application Programming Interface,简称 A

Windows API 大全

常用Windows API1. API之网络函数WNetAddConnection 创建同一个网络资源的永久性连接WNetAddConnection2 创建同一个网络资源的连接WNetAddConnection3 创建同一个网络资源的连接WNetCancelConnection 结束一个网络连接WNetCancelConnection2 结束一个网络连接WNetCloseEnum 结束一次枚举操作WNetConnectionDialog 启动一个标准对话框,以便建立同网络资源的连接WNetDis

c运行库、c标准库、windows API的区别和联系

C运行时库函数C运行时库函数是指C语言本身支持的一些基本函数,通常是汇编直接实现的.  API函数API函数是操作系统为方便用户设计应用程序而提供的实现特定功能的函数,API函数也是C语言的函数实现的. 区别他们之间区别是:API函数是针对操作系统的,C语言运行时函数则是针对C语言本身的. ·1.运行时库就是 C run-time library,是C而非C++语言世界的概念.     取这个名字就是因为你的C程序运行时需要这些库中的函数. ·2.C语言是所谓的“小内核”语言,就其语言本身来说很