最近在做項目的過程中,涉及到對硬體啟用及禁用的功能(在指定時間段內才能啟用硬體)。因為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);