Wie man freundlich Gerätenamen aus DEV_BROADCAST_DEVICEINTERFACE und Geräte-Instanz-ID
Habe ich registriert ein Fenster mit RegisterDeviceNotification und kann erfolgreich erhalten DEV_BROADCAST_DEVICEINTERFACE Nachrichten. Jedoch, die dbcc_name
Feld in der zurückgegebenen struct ist immer leer. Die Struktur habe ich so definiert:
[StructLayout(LayoutKind.Sequential)]
public struct DEV_BROADCAST_DEVICEINTERFACE
{
public int dbcc_size;
public int dbcc_devicetype;
public int dbcc_reserved;
public Guid dbcc_classguid;
[MarshalAs(UnmanagedType.LPStr)]
public string dbcc_name;
}
Und ich bin mit Marshal.PtrToStructure
auf den LParam der WM_DEVICECHANGE Nachricht.
Sollten diese arbeiten?
Oder noch besser... gibt es eine alternative Möglichkeit, um den Namen des Geräts bei der Verbindung?
BEARBEITEN (02/05/2010 20:56GMT):
Fand ich heraus, wie man die dbcc_name Feld zu füllen, durch, dies zu tun:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct DEV_BROADCAST_DEVICEINTERFACE
{
public int dbcc_size;
public int dbcc_devicetype;
public int dbcc_reserved;
public Guid dbcc_classguid;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=255)]
public string dbcc_name;
}
aber ich brauche immer noch einen Weg, um einen "Benutzerfreundlichen" Namen aus was ist int dbcc_name. Es sieht wie folgt aus:
\?\USB#VID_05AC&PID_1294&MI_00#0#{6bdd1fc6-810f-11d0-bec7-08002be2092f}
Ist und ich wirklich wollen einfach nur, es zu sagen "Apple iPhone" (das ist das, was das Gerät in diesem Fall).
InformationsquelleAutor snicker | 2010-02-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gut, wie oben erwähnt, fand ich heraus, wie man dbcc_name zu füllen richtig. Ich fand, dass dies der einfachste Weg, um das Gerät-name:
InformationsquelleAutor snicker
Diese Informationen können auch erworben werden mehr formal durch SetupAPI. Pass
dbcc_name
zuSetupDiOpenDeviceInterface
und die freundliche Namen mitSetupDiGetDeviceRegistryProperty
vorbei inSPDRP_FRIENDLYNAME
.Hier einige Delphi-code, der wird es tun. (Sorry, Sie haben zu übersetzen C# - unabhängig).
Schließlich... wenn Sie eine Möglichkeit zur Identifizierung eines USB-Geräts (nicht das, was Sie gefragt, aber Häufig ist dies auch nötig), schauen Sie in
SetupDiGetDeviceInstanceId
.Es ist nie zu spät für eine bessere Antwort =) (ich bevorzuge eine formale API über die manuelle string-parsing-jeden Tag)
wenn Sie jemanden finden, der es übersetzen zu C#, ich werde ändern Sie die akzeptierte Antwort. Dies wäre der absolut bessere Lösung, den code, den ich oben gepostet stinkt und beruht auf etwas, das immer in der gleichen Position in der Registrierung (oder die Registrierung bestehender überhaupt), eine winapi-Lösung ist am besten
So ist das in C#?
InformationsquelleAutor Nathan Schubkegel
Es ist wahrscheinlich, dass Sie brauchen, um dies zu ändern geringfügig
Legen Sie die
dbcc_size
bis 255, und konstruieren Sie die StringBuilder-wie unten gezeigt:Dann passieren, dass die Struktur, den Wert von
dbcc_name
gefüllt werden sollten.Edit: nach kichern's Kommentar...ich dachte, dies ist ein weiterer Weg,...
Legen Sie die
dbcc_size
bis 255, und nehmen Sie von dort...Edit#2: Das ist interessant...bin nicht so sicher, nun, ich fand diesen Artikel verwendet
RegisterDeviceNotification
auf Codeproject und es verwendet eine andere Art von RegisterDeviceNotification, dass die struct wird umgewandelt in eineIntPtr
und wird verwendet, um rufen Sie die API...gerade gemerkt...Bearbeiten diese Antwort ein bisschen mehr..
Tom. Edit-funktioniert immer noch nicht. Sie können nur Marschall-strings, LPStr, LPWStr, LPTStr, BStr, oder ByValTStr.
haben Sie versucht, die änderung, die das Attribut"[System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.LPStr, SizeConst = 255, ArraySubType = System.- Laufzeit.InteropServices.UnmanagedType.LPStr)]'
Gleiche Ergebnisse. No Name
InformationsquelleAutor t0mm13b