通過API實現C#對硬體的控制(一)

來源:互聯網
上載者:User

最近在做項目的過程中,涉及到對硬體啟用及禁用的功能(在指定時間段內才能啟用硬體)。因為C#自身對硬體的操作基本為零,為此,搜尋了一下MSDN中與裝置相關的API函數。還果然就有。下面一一列舉出各函數的原型及相關的說明文檔。並將其轉為C#代碼實現。

函數一: RegisterDeviceNotification
功能:註冊裝置或者裝置類型,在指定的視窗返回相關的資訊

原型:

HDEVNOTIFY WINAPI RegisterDeviceNotification(
  __in  HANDLE hRecipient,
  __in  LPVOID NotificationFilter,
  __in  DWORD Flags
);

參考說明文檔:http://msdn2.microsoft.com/en-us/library/aa363431.aspx。

轉為C#後的代碼為:

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
       
public static extern IntPtr RegisterDeviceNotification(IntPtr
hRecipient, DEV_BROADCAST_DEVICEINTERFACE NotificationFilter, UInt32
Flags);
        [StructLayout(LayoutKind.Sequential)]
        public class DEV_BROADCAST_DEVICEINTERFACE
        ...{
            public int dbcc_size;
            public int dbcc_devicetype;
            public int dbcc_reserved;
        }

函數二:UnregisterDeviceNotification
功能:通過名柄,關閉指定裝置的資訊。(主要應用於清理非託管資源,並與RegisterDeviceNotification配對使用)

原型:

BOOL WINAPI UnregisterDeviceNotification(
  __in  HDEVNOTIFY Handle
);

參考說明文檔:http://msdn2.microsoft.com/en-us/library/aa363475(VS.85).aspx。

轉為C#後的代碼:

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern uint UnregisterDeviceNotification(IntPtr hHandle);

函數三:SetupDiGetClassDevs
功能:擷取一個指定類別或全部類別的所有已安裝裝置的資訊。

原型:

HDEVINFO  SetupDiGetClassDevs(    IN LPGUID  ClassGuid,  OPTIONAL   
IN PCTSTR  Enumerator,  OPTIONAL    IN HWND  hwndParent,  OPTIONAL   
IN DWORD  Flags    );
參考說明文檔:http://msdn2.microsoft.com/en-us/library/ms792959.aspx。

轉為C#後的代碼:

        [DllImport("setupapi.dll", SetLastError = true)]
        public static extern IntPtr SetupDiGetClassDevs(ref Guid gClass, UInt32 iEnumerator, IntPtr hParent, UInt32 nFlags);

函數四:SetupDiDestroyDeviceInfoList
功能:銷毀一個裝置資訊集合,並且釋放所有關聯的記憶體。

原型:

WINSETUPAPI BOOL WINAPI  SetupDiDestroyDeviceInfoList(    IN HDEVINFO  DeviceInfoSet    );
參考說明文檔:http://msdn2.microsoft.com/en-us/library/ms792991.aspx。

轉為C#後的代碼:

        [DllImport("setupapi.dll", SetLastError = true)]
        public static extern int SetupDiDestroyDeviceInfoList(IntPtr lpInfoSet);

函數五:SetupDiEnumDeviceInfo
功能:枚舉指定裝置資訊集合的成員,並將資料放在SP_DEVINFO_DATA中。

原型:

WINSETUPAPI BOOL WINAPI  SetupDiEnumDeviceInfo(
IN HDEVINFO  DeviceInfoSet,
IN DWORD  MemberIndex,
 OUT PSP_DEVINFO_DATA  DeviceInfoData    );
參考說明文檔:http://msdn2.microsoft.com/en-us/library/ms792983.aspx。

轉為C#後的代碼:

        [DllImport("setupapi.dll", SetLastError = true)]
        public static extern bool SetupDiEnumDeviceInfo(IntPtr lpInfoSet, UInt32 dwIndex, SP_DEVINFO_DATA devInfoData);
        /**//// <summary>
        /// 裝置資訊資料
    /// </summary>
        [StructLayout(LayoutKind.Sequential)]
        public class SP_DEVINFO_DATA
        ...{
            public int cbSize;
            public Guid classGuid;
            public int devInst;
            public ulong reserved;
        };

函數六:SetupDiGetDeviceRegistryProperty
功能:擷取指定裝置的屬性。

原型:

WINSETUPAPI BOOL WINAPI  SetupDiGetDeviceRegistryProperty(
IN HDEVINFO  DeviceInfoSet,
IN PSP_DEVINFO_DATA  DeviceInfoData,
IN DWORD  Property,
OUT PDWORD  PropertyRegDataType,
OPTIONAL    OUT PBYTE  PropertyBuffer,
IN DWORD  PropertyBufferSize,
OUT PDWORD  RequiredSize  OPTIONAL    );
參考說明文檔:http://msdn2.microsoft.com/en-us/library/ms792967.aspx。

轉為C#後的代碼:

        [DllImport("setupapi.dll", SetLastError = true)]
       
public static extern bool SetupDiGetDeviceRegistryProperty(IntPtr
lpInfoSet, SP_DEVINFO_DATA DeviceInfoData, UInt32 Property, UInt32
PropertyRegDataType, StringBuilder PropertyBuffer, UInt32
PropertyBufferSize, IntPtr RequiredSize);

函數七:SetupDiSetClassInstallParams
功能:停用裝置。

原型:

WINSETUPAPI BOOL WINAPI
 SetupDiSetClassInstallParams(
    IN HDEVINFO  DeviceInfoSet,
    IN PSP_DEVINFO_DATA  DeviceInfoData,
    OPTIONAL    IN PSP_CLASSINSTALL_HEADER  ClassInstallParams,
    OPTIONAL    IN DWORD  ClassInstallParamsSize    );
參考說明文檔:http://msdn2.microsoft.com/en-us/library/ms792876.aspx。

轉為C#後的代碼:

        [DllImport("setupapi.dll", SetLastError = true, CharSet = CharSet.Auto)]
       
public static extern bool SetupDiSetClassInstallParams(IntPtr
DeviceInfoSet, IntPtr DeviceInfoData, IntPtr ClassInstallParams, int
ClassInstallParamsSize);

函數八:SetupDiCallClassInstaller
功能:啟用裝置。

原型:

WINSETUPAPI BOOL WINAPI
  SetupDiCallClassInstaller(
    IN DI_FUNCTION  InstallFunction,
    IN HDEVINFO  DeviceInfoSet,
    IN PSP_DEVINFO_DATA  DeviceInfoData  OPTIONAL    );
參考說明文檔:http://msdn2.microsoft.com/en-us/library/ms792989.aspx。

轉為C#後的代碼:

        [DllImport("setupapi.dll", CharSet = CharSet.Auto)]
       
public static extern Boolean SetupDiCallClassInstaller(UInt32
InstallFunction, IntPtr DeviceInfoSet, IntPtr DeviceInfoData);

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.