c如何獲取usb設備名
⑴ linux c 程序中如何獲取未掛載的usb設備的信息
利用c語言調用系統命令fdisk 然後使用grep匹配結果,並將結果反饋回c,利用c判斷是否有U盤掛載,檢測到有在使用c調用系統函數mount 掛載U盤到指定目錄下 這個方法可以嘗試一下
⑵ C Shape的WndPrco如何獲取當前USB盤符
我可以給您提供C#的代碼,但是我覺得那樣對您沒有好處。
我先給您一個解決方案吧:
使用System.IO.DriveInfo類可以獲取當前系統中的驅動器的信息。調用GetDrives方法獲取驅動器名稱然後判斷DriveType枚舉是否等於Removable就可以了。
然後就是自動獲取盤符的問題,您可以使用Timer,但是這樣會對性能有比較大的影響,比較好的一個方法是重寫窗體的WndProc方法,然後截取WM_DEVICECHANGE系統消息。
簡單的代碼如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace WindowsApplication1
{
public partial class Form1 : Form
{
const int WM_DEVICECHANGE = 0x0219;
public Form1()
{
InitializeComponent();
}
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_DEVICECHANGE)
{
MessageBox.Show("Got it!");
}
base.WndProc(ref m);
}
}
}
您需要首先聲明Windows消息的消息ID,然後重寫WndProc方法來進行判斷。
很抱歉對於將PID轉化為盤符的方法,我現在沒有很好的方法。
⑶ 怎麼獲取USB的設備號
ifdata.cbSize = sizeof(ifdata);
// 枚舉符合該GUID的設備介面
bResult = ::SetupDiEnumDeviceInterfaces(
hDevInfoSet, // 設備信息集句柄
NULL, // 不需額外的設備描述
(LPGUID)&HARDDISK_GUID,//GUID_CLASS_USB_DEVICE, // GUID
(ULONG)nCount, // 設備信息集里的設備序號
&ifdata); // 設備介面信息
if (bResult)
{
ULONG predictedLength = 0;
ULONG requiredLength = 0;
// 取得該設備介面的細節(設備路徑)
bResult = (
hDevInfoSet, // 設備信息集句柄
&ifdata, // 設備介面信息
NULL, // 設備介面細節(設備路徑)
0, // 輸出緩沖區大小
&requiredLength, // 不需計算輸出緩沖區大小(直接用設定值)
NULL); // 不需額外的設備描述
// 取得該設備介面的細節(設備路徑)
predictedLength=requiredLength;
// if(pDetail)
// {
// pDetail =NULL;
// }
pDetail = (PSP_INTERFACE_DEVICE_DETAIL_DATA)::GlobalAlloc(LMEM_ZEROINIT, predictedLength);
pDetail- >cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
bResult = (
hDevInfoSet, // 設備信息集句柄
&ifdata, // 設備介面信息
pDetail, // 設備介面細節(設備路徑)
predictedLength, // 輸出緩沖區大小
&requiredLength, // 不需計算輸出緩沖區大小(直接用設定值)
NULL); // 不需額外的設備描述
if (bResult)
{
// 復制設備路徑到輸出緩沖區
for(int i=0;i <17;i++){
ch[i]=*(pDetail- >DevicePath+8+i);
}
ch[17]= "/0 ";
if (strcmp(ch,"vid_11dd&pid_0101")==0 ¦ ¦
strcmp(ch,"vid_11dd&pid_11dd")==0 ¦ ¦
strcmp(ch,"vid_0101&pid_0101")==0 ¦ ¦
strcmp(ch,"vid_0101&pid_11dd")==0) //比較版本號,防止意外出錯
{
len = strlen(pDetail- >DevicePath);
devicename = new char[len];
memset(devicename, 0, len);
for(int i=0;i <(len-38);i++)
{
ch[i]=*(pDetail- >DevicePath+i);
}
ch[len-38]= "/0 ";
memset(volume, 0, MAX_PATH);
}
}
}
nCount++;
}
// 釋放設備介面數據空間
::GlobalFree(pDetail);
// 關閉設備信息集句柄
::SetupDiDestroyDeviceInfoList(hDevInfoSet);
}
⑷ C++程序中,怎麼獲取連接到usb上的設備的句柄
得區分通信協議來進行操作
如果是USB協議(有驅)那麼通過驅動安裝包中專的INI文件得到設備屬GUID,調用SETUPAPI.DLL的SetupDiEnumDeviceInterfaces SetupDiGetClassDevsa SetupDiDestroyDeviceInfoList 幾個API來枚舉出USB設備路徑,然後用CreateFile來得到設備句柄
如果是HID協議(無驅)因為所有的HID設備GUID是一樣的,那麼在同上步驟得到句柄後再調用HID.DLL的HidD_GetAttributes來得到PID和VID來確定是否是自己需要連接的設備。
⑸ 如何使用C語言編程讀取從電腦usb介面的信息。
可以打開介面上的設備,或者打開USB控制器,那涉及到windows的驅動訪問。
一般訪問設備使用CreateFile打開設備,然後使用ReadFile/WriteFile讀寫設備。
比如:
HANDLE hFile = CreateFile(..., FILE_FLAG_OVERLAPPED, ...); //指定以非同步方式打開
BYTE bBuffer[100];
OVERLAPPED o = { 0 };
o.Offset = 345;
BOOL bReadDone = ReadFile(hFile, bBuffer, 100, NULL, &o); // bReadDone 指定I/O請求是不是以同步方式打開
DWORD dwError = GetLastError();
if (!bReadDone && (dwError == ERROR_IO_PENDING)) { //非同步方式打開
// The I/O is being performed asynchronously; wait for it to complete
WaitForSingleObject(hFile, INFINITE);
bReadDone = TRUE;
}
if (bReadDone) {
// o.Internal contains the I/O error
// o.InternalHigh contains the number of bytes transferred
// bBuffer contains the read data
} else {
// An error occurred; see dwError
}
⑹ vc獲得usb設備名稱
如果是動態監測,即監測U盤插入可以通過監聽WM_DEVICECHANGE消息來實現,並從WM_DEVICECHANGE消息的lParam里獲取盤符。內
如果是靜態檢容測,即U盤已經插入,可以通過WinAPI GetDriveType 獲得驅動器類型。用一個循環判斷所有當前驅動器(結合GetLogicalDriveStrings),如果類型為DRIVE_REMOVABLE,則該驅動器為U盤。
具體代碼例子網上都可以搜索到的,google一下吧,祝你成功。
⑺ 如何得到USB設備對應的盤符
【問題描述】:抄移動硬碟襲不顯示【原因分析】:1. 供電不足會導致移動設備無法正常識別2. 電腦設置問題3. 主板的驅動程序及USB驅動程序異常4. 移動硬碟故障【簡易步驟】:【我的電腦】—右鍵【管理】—【磁碟管理】—【移動硬碟】—右鍵【更改驅動器和路徑】—向下的【小三角】—隨意分配一個字母—【確定】【解決方案:】:方案一:更換usb介面。如果是台式機可以嘗試插入到機箱的後面板,(有時候供電不足會導致移動設備無法正常識別)方案二:電腦設置問題1. 【我的電腦】右鍵點擊【管理】—【磁碟管理】(如圖1)圖12. 找到移動硬碟,如果上面沒有盤符可以手動添加一個盤符。在【移動硬碟】上單擊右鍵—【更改驅動器和路徑】(如圖2)圖23. 點擊【更改】,點擊【向下的小三角】,隨意分配一個字母即可。點擊【確定】(如圖3)圖3方案三:使用隨機光碟重裝一下主板的驅動程序及USB驅動程序。方案四:移動硬碟故障,建議移動硬碟售後檢修
⑻ C#怎麼獲取已知USB設備驅動信息
usingSystem.Management;//在項目==》添加引用
classProgram
{
staticvoidMain(string[]args)
{
varusbDevices=GetUSBDevices();
foreach(varusbDeviceinusbDevices)
{
Console.WriteLine("DeviceID:{0},PNPDeviceID:{1},Description:{2} ",
usbDevice.DeviceID,usbDevice.PnpDeviceID,usbDevice.Description);
}
}
staticList<USBDeviceInfo>GetUSBDevices()
{
List<USBDeviceInfo>devices=newList<USBDeviceInfo>();
;
using(varsearcher=newManagementObjectSearcher(@"Select*FromWin32_USBHub"))
collection=searcher.Get();
foreach(vardeviceincollection)
{
devices.Add(newUSBDeviceInfo(
(string)device.GetPropertyValue("DeviceID"),
(string)device.GetPropertyValue("PNPDeviceID"),
(string)device.GetPropertyValue("Description")
));
}
collection.Dispose();
returndevices;
}
}
classUSBDeviceInfo
{
publicUSBDeviceInfo(stringdeviceID,stringpnpDeviceID,stringdescription)
{
this.DeviceID=deviceID;
this.PnpDeviceID=pnpDeviceID;
this.Description=description;
}
publicstringDeviceID{get;privateset;}
publicstringPnpDeviceID{get;privateset;}
publicstringDescription{get;privateset;}
}
⑼ 如何在linux下在應用層得到USB設備名稱信息
先獲取一下/dev的列表, 然後得到插播事件後, 在獲取一下當前的/dev列表,然回後做一下比較答 linux系統會自動識別USB介面為串口磁碟sda(通常為sda1,可通過fdisk -l命令查詢),掛載就可用。
