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

2021-05-24 03:17:33 字數 4651 閱讀 1469

最近在做專案的過程中,涉及到對硬體啟用及禁用的功能(在指定時間段內才能啟用硬體)。因為c#自身對硬體的操作基本為零,為此,搜尋了一下msdn中與裝置相關的api函式。還果然就有。下面一一枚舉出各函式的原型及相關的說明文件。並將其轉為c#**實現。

原型: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_deviceinte***ce notificationfilter, uint32 flags);

[structlayout(layoutkind.sequential)]

public class dev_broadcast_deviceinte***ce

...函式二: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);

/**

/// 裝置資訊資料

///

[structlayout(layoutkind.sequential)]

public class sp_devinfo_data

...;

函式六: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);

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

原文 下面是該類的 using system using system.collections.generic using system.text using system.runtime.interopservices namespace hardware wm devicechange mess...

通過win32api讓c 控制Windows工作列

c 中宣告如下 using system.runtime.interopservices dllimport user32.dll entrypoint findwindowa public static extern intptr findwindowa string lp1,string lp2...

VB對低層硬體的訪問控制

vb沒有提供直接訪問低層硬體的控制項和方法,一度給對訪問硬體感興趣的程式設計者帶來不便。目前我們可從網上搜尋到支援低層硬體訪問的dll和activex控制項,通過它們可讀寫儲存器單元 埠,甚至控制硬體中斷。下面通過兩個利用dll和activex控制項示例介紹vb對低層硬體的訪問控制。一 利用dll讀...