ورود

View Full Version : خواندن اطلاعات از USB



ASGGSA
دوشنبه 19 دی 1390, 16:49 عصر
سلام دوستان :
كسي ميدونه چطور ميشه تشخيص داد كه هم اكنون دستگاهي به USB متصل است يا نه. در صورت متصل بودن بتونيم اطلاعاتي از هر نوع (باينري و ...) رو از اون دستگاه بگيريم.
بطور مثال صفحه كليد_موشواره_وب كم و ... متصل به USB.

jeson_park
شنبه 24 دی 1390, 22:09 عصر
با سلام
با تابع GetDriveType و یه شرط می تونید این کار رو انجام بدید

if( GetDriveType(L"i:") == DRIVE_REMOVABLE)
// do Somthing

پیغامی هم که ویندوز می فرسته WM_DEVICECHANGE هست
این همی یه نمونه کد

#include <windows.h>
#include <dbt.h>
#include <strsafe.h>
#pragma comment(lib, "user32.lib" )

void Main_OnDeviceChange( HWND hwnd, WPARAM wParam, LPARAM lParam );
char FirstDriveFromMask( ULONG unitmask ); //prototype

/*------------------------------------------------------------------
Main_OnDeviceChange( hwnd, wParam, lParam )

Description
Handles WM_DEVICECHANGE messages sent to the application's
top-level window.
--------------------------------------------------------------------*/

void Main_OnDeviceChange( HWND hwnd, WPARAM wParam, LPARAM lParam )
{
PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)lParam;
TCHAR szMsg[80];

switch(wParam )
{
case DBT_DEVICEARRIVAL:
// Check whether a CD or DVD was inserted into a drive.
if (lpdb -> dbch_devicetype == DBT_DEVTYP_VOLUME)
{
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;

if (lpdbv -> dbcv_flags & DBTF_MEDIA)
{
StringCchPrintf( szMsg, sizeof(szMsg)/sizeof(szMsg[0]),
TEXT("Drive %c: Media has arrived.\n"),
FirstDriveFromMask(lpdbv ->dbcv_unitmask) );

MessageBox( hwnd, szMsg, TEXT("WM_DEVICECHANGE"), MB_OK );
}
}
break;

case DBT_DEVICEREMOVECOMPLETE:
// Check whether a CD or DVD was removed from a drive.
if (lpdb -> dbch_devicetype == DBT_DEVTYP_VOLUME)
{
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;

if (lpdbv -> dbcv_flags & DBTF_MEDIA)
{
StringCchPrintf( szMsg, sizeof(szMsg)/sizeof(szMsg[0]),
TEXT("Drive %c: Media was removed.\n" ),
FirstDriveFromMask(lpdbv ->dbcv_unitmask) );

MessageBox( hwnd, szMsg, TEXT("WM_DEVICECHANGE" ), MB_OK );
}
}
break;

default:
/*
Process other WM_DEVICECHANGE notifications for other
devices or reasons.
*/
;
}
}

/*------------------------------------------------------------------
FirstDriveFromMask( unitmask )

Description
Finds the first valid drive letter from a mask of drive letters.
The mask must be in the format bit 0 = A, bit 1 = B, bit 2 = C,
and so on. A valid drive letter is defined when the
corresponding bit is set to 1.

Returns the first drive letter that was found.
--------------------------------------------------------------------*/

char FirstDriveFromMask( ULONG unitmask )
{
char i;

for (i = 0; i < 26; ++i)
{
if (unitmask & 0x1)
break;
unitmask = unitmask >> 1;
}

return( i + 'A' );
}

pe32_64
پنج شنبه 06 بهمن 1390, 17:58 عصر
با createfile میشه داخل حافظه ها نوشت.

pe32_64
پنج شنبه 06 بهمن 1390, 18:15 عصر
بسته یه اینکه دستگاه چیه، کلی چیزدیگه هم ممکنه به بالا اضافه شود.
از Directshow برای وبکم
و اینکه دستگهای عمومی (صفحه كليد_موشواره) مستقل از نحوه ی اتصال (usb,...) با هاشون ارتباط بر قرار میشه(WMI (http://msdn.microsoft.com/en-us/library/windows/desktop/aa394582%28v=vs.85%29.aspx),توابعAPI,... )

حامد مصافی
جمعه 07 بهمن 1390, 10:18 صبح
تمام دستگاه هایی که به پورت USB متصل می شوند الزاما یک حافظه جانبی نیستند.
حافظه های جانبی به شرطی که توسط ویندوز شناسایی شوند توسط کد های فوق قابل دسترسی اند. اما در مورد سایر وسائلی که ممکن است به USB متصل شوند باید یک راه انداز مخصوص خودتان بنویسید یا اینکه از یک رابط از قبل نوشته شده استفاده کنید. برای مثال libusb (البته گمان می کنم شما به نسخه ویندوزی نیاز دارید)
http://www.libusb.org/wiki/libusb-win32

pe32_64
جمعه 07 بهمن 1390, 13:22 عصر
پیرو صحبت های جناب مصافی، باید بگم که فرض اینه که درایور موجود هست،بعد باAPI های مناسب می شه به وصیله دستیابی داشت