سؤال

أرغب في الدورة (محاكاة إلغاء توصيل وإعادة إدخالها) جهاز USB (مودم) بعد إطلاق حدث معين. لقد وجدت عينة على CodeProject:

http://www.codeproject.com/kb/system/usbevence.aspx.

التي تسمح لي بتحديد + إخراج الجهاز عبر المسلسل غير المتقلب، لكنني بحاجة إلى إعادة التدوير، وليس فقط إخراج.

لقد قرأت هذا:

http://www.tech-archive.net/archive/development/microsoft.public.development.device.drivers/2005-02/1292.html.

لا أفهمها.

وقد تم ذكر هذا في المشاركات الأخرى المتعلقة USB:

http://www.codeproject.com/kb/system/drivetector.aspx.

انها ليست ذات صلة بمشكلتي.

هل كانت مفيدة؟

المحلول

حصلت عليه يعمل باستخدام أداة Commandline تسمى DevCon، والتي اتصلت بها ثم من التعليمات البرمجية.

انخفض devcon.exe إلى أحد مسارات النظام حتى يعمل في كل مكان.

ديفكون: ديفكون

دعا: devcon إزالة * USB "* MI_01"

ثم دعا: ديفكون ريسان

الشفرة:

 System.Diagnostics.Process proc = new System.Diagnostics.Process();
 proc.StartInfo.FileName = "DEVCON";
 proc.StartInfo.Arguments = "Remove *usb"*MI_01";
 proc.StartInfo.RedirectStandardError = true;
 proc.StartInfo.RedirectStandardOutput = true;
 proc.StartInfo.UseShellExecute = false;
 proc.Start();

نصائح أخرى

يمكنك استعمال ال C # Hardware Helper Lib وأضف وظيفة إعادة الضبط.

فقط تأكد من إضافة

public const int DICS_PROPCHANGE = ((0x00000003)); 

في ال public class Native تحت // parm،

public bool ResetDevice( IntPtr hDevInfo, IntPtr devInfoData )
{
int szOfPcp;
IntPtr ptrToPcp;
int szDevInfoData;
IntPtr ptrToDevInfoData;

Native.SP_PROPCHANGE_PARAMS pcp = new Native.SP_PROPCHANGE_PARAMS();
pcp.ClassInstallHeader.cbSize = Marshal.SizeOf(typeof(Native.SP_CLASSINSTALL_HEADER));
pcp.ClassInstallHeader.InstallFunction = Native.DIF_PROPERTYCHANGE;
pcp.StateChange = Native.DICS_PROPCHANGE; // for reset
pcp.Scope = Native.DICS_FLAG_CONFIGSPECIFIC;
pcp.HwProfile = 0;

szOfPcp = Marshal.SizeOf(pcp);
ptrToPcp = Marshal.AllocHGlobal(szOfPcp);
Marshal.StructureToPtr(pcp, ptrToPcp, true);
szDevInfoData = Marshal.SizeOf(devInfoData);
ptrToDevInfoData = Marshal.AllocHGlobal(szDevInfoData);
Marshal.StructureToPtr(devInfoData, ptrToDevInfoData, true);

bool rslt1 = Native.SetupDiSetClassInstallParams(hDevInfo, ptrToDevInfoData, ptrToPcp, Marshal.SizeOf(typeof(Native.SP_PROPCHANGE_PARAMS)));
bool rstl2 = Native.SetupDiCallClassInstaller(Native.DIF_PROPERTYCHANGE, hDevInfo, ptrToDevInfoData);

if (rslt1 && rstl2)
{
    return true;
}
return false;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top