Das IOCTL_STORAGE_LOAD_MEDIA, IOCTL_HID_ACTIVATE_DEVICE und IOCTL_HID_DEACTIVATE_DEVICE klingt schonmal gut.
Werd' ich dann mal ausprobieren.
Nja, wenn ich Pech hab, dann sind die für eine Nutzung in 'nem HID Minidriver, welchen ich nicht hab/nutze.
Das dort entdeckte IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER klingt och nett.
OK, danke erstmal und bis nach den Tests.
Zum Suchen hatte ich mir gestern auch dieses hier zusammengebastelt.
Delphi-Quellcode:
Uses JwaBluetoothAPIs;
Var
RH: HBLUETOOTH_RADIO_FIND;
RP: BLUETOOTH_FIND_RADIO_PARAMS;
R: THandle;
RI: BLUETOOTH_RADIO_INFO;
DH: HBLUETOOTH_DEVICE_FIND;
DP: BLUETOOTH_DEVICE_SEARCH_PARAMS;
DI: BLUETOOTH_DEVICE_INFO;
RP.dwSize := SizeOf(RP);
RH := BluetoothFindFirstRadio(@RP, R);
If RH <> 0
Then Begin
Repeat
RI.dwSize := SizeOf(RI);
If BluetoothGetRadioInfo(R, RI) = ERROR_SUCCESS
Then Begin
ShowMessage(Format('
address (%02x:%02x:%02x:%02x:%02x:%02x)'#10 +
'
name "%s"'#10'
class %d'#10'
subversion %d'#10'
manufacturer %d', [
RI.address.rgBytes[0], RI.address.rgBytes[1], RI.address.rgBytes[2],
RI.address.rgBytes[3], RI.address.rgBytes[4], RI.address.rgBytes[5],
RI.szName, RI.ulClassofDevice, RI.lmpSubversion, RI.manufacturer]));
End Else ShowMessage(SysErrorMessage(GetLastError));
ZeroMemory(@
DP, SizeOf(
DP));
DP.dwSize := SizeOf(
DP);
{DP.fReturnAuthenticated := True;{}
{DP.fReturnRemembered := True;{}
{DP.fReturnUnknown := True;{}
{}DP.fReturnConnected := True;
{}
{DP.fIssueInquiry := True;{}
DP.hRadio := R;
DI.dwSize := SizeOf(DI);
DH := BluetoothFindFirstDevice(
DP, DI);
If DH <> 0
Then Begin
Repeat
ShowMessage(Format('
address (%02x:%02x:%02x:%02x:%02x:%02x)'#10'
class %d'#10 +
'
connected %d'#10'
remembered %d'#10'
authenticated %d'#10'
name "%s"', [
DI.Address.rgBytes[0], DI.Address.rgBytes[1], DI.Address.rgBytes[2],
DI.Address.rgBytes[3], DI.Address.rgBytes[4], DI.Address.rgBytes[5],
DI.ulClassofDevice, Ord(DI.fConnected), Ord(DI.fRemembered),
Ord(DI.fAuthenticated), DI.szName]));
Until not BluetoothFindNextDevice(DH, DI);
BluetoothFindDeviceClose(DH);
End Else If GetLastError <> ERROR_NO_MORE_ITEMS
Then ShowMessage(SysErrorMessage(GetLastError));
CloseHandle(R);
Until not BluetoothFindNextRadio(RH, R);
BluetoothFindRadioClose(RH);
End Else If GetLastError <> ERROR_NO_MORE_ITEMS
Then ShowMessage(SysErrorMessage(GetLastError));
ZeroMemory(@
DP, SizeOf(
DP));
DP.dwSize := SizeOf(
DP);
{DP.fReturnAuthenticated := True;{}
{DP.fReturnRemembered := True;{}
{DP.fReturnUnknown := True;{}
{}DP.fReturnConnected := True;
{}
{DP.fIssueInquiry := True;{}
//DP.hRadio := 0;
DI.dwSize := SizeOf(DI);
DH := BluetoothFindFirstDevice(
DP, DI);
If DH <> 0
Then Begin
Repeat
ShowMessage(Format('
address (%02x:%02x:%02x:%02x:%02x:%02x)'#10'
class %d'#10 +
'
connected %d'#10'
remembered %d'#10'
authenticated %d'#10'
name "%s"', [
DI.Address.rgBytes[0], DI.Address.rgBytes[1], DI.Address.rgBytes[2],
DI.Address.rgBytes[3], DI.Address.rgBytes[4], DI.Address.rgBytes[5],
DI.ulClassofDevice, Ord(DI.fConnected), Ord(DI.fRemembered),
Ord(DI.fAuthenticated), DI.szName]));
//if BluetoothRemoveDevice(DI.Address) <> ERROR_SUCCESS then
// ShowMessage(SysErrorMessage(GetLastError));
Until Not BluetoothFindNextDevice(DH, DI);
BluetoothFindDeviceClose(DH);
End Else If GetLastError <> ERROR_NO_MORE_ITEMS
Then ShowMessage(SysErrorMessage(GetLastError));
Leider findet das garnichs oder nicht alles.
Jedenfalls schein ich es nicht hinzibekommen das BLUETOOTH_DEVICE_SEARCH_PARAMS (
DP) so zu setzen, daß alles gefunden wird.
Weiteres, wie Nachfolgendes, hab ich noch nicht ausprobieren (können).
BluetoothRemoveDevice
BluetoothAuthenticateDevice
BluetoothSetServiceState
BluetoothEnumerateInstalledServices
BluetoothIsConnectable
BluetoothEnableIncomingConnections
BluetoothRegisterForAuthentication
BluetoothUnregisterAuthentication
BluetoothSendAuthenticationResponse
Mein Problem ist auch noch, daß ich es einmal hinbekommen hatte, mein Device zwar aufzulisten, aber eine "Verbindung" zum zugehörigen HID-Control war nicht möglich.
Im Prinzip könnte ich in meiner HID-Komponente noch sowas wie das "address (%02x:%02x:%02x:%02x:%02x:%02x)" benötigen,
denn wenn ich z.B. zwei gleiche Controls angeschlossen hab, dann weiß ich nicht direkt, welches meiner HID-Objekte welchem Control in der Bluetooth-Verwaltung entspricht.
[add]
Wenn ich BluetoothGetRadioInfo direkt auf ein FileHandle zu einem HID-Device loslaß, dann meint es zwar "alles OK" (ERROR_SUCCESS), aber der ganze Record ist nur mit Nullen gefüllt.
Und BluetoothGetDeviceInfo meint dann nur ERROR_NOT_FOUND.
(wär ja auch zu einfach gewesen)
[add]
Hab es nun ganz einfach erstmal mit dem Auswerfen versucht.
Bei IOCTL_HID_DEACTIVATE_DEVICE auf das DeviceHandle "\\?\hid#vid_057e&pid...0030}" angewendet sagt mir DeviceIoControl was von OK/True, aber nichts passiert.
Ich weiß allerdings nicht wie ich was genau als In-Parameter an DeviceIoControl übergeben soll, aber egal was, es bleibt beim True und es hat dennoch keinerlei Auswirkungen (Control bleibt angemeldet und nutzbar).
Wenn das Trennen/Deaktivieren eines verbundenen Gerätes schon nicht funktioniert, dann erspar ich mir die Versuche mit IOCTL_HID_ACTIVATE_DEVICE erstmal.
Auch bei IOCTL_STORAGE_LOAD_MEDIA wird True geliefert und ebenfalls nichts passiert.
(hier natürlich andersrum, also das Gerät befindet sich, laut der Bluetooth-Steuerung, im "Leerlauf" und war/ist noch nicht verbunden)
Wobei ich bei IOCTL_STORAGE_LOAD_MEDIA nicht viel falsch machen kann, da alle Parameter eh nil sind.