Einzelnen Beitrag anzeigen

Benutzerbild von Cylence
Cylence

Registriert seit: 2. Sep 2004
Ort: Allgäu
246 Beiträge
 
Delphi 7 Enterprise
 
#1

Bluetooth Geräte in der Näher erkennen

  Alt 7. Feb 2011, 08:53
Hallo,

ich möchte Bluetooth Geräte in der Nähe erkennen. Ich habe dazu schon etwas gefunden, was an sich auch mehr oder weniger geht:

Delphi-Quellcode:

uses
  jwaBluetoothApis;
  

procedure TForm1.BitBtn1Click(Sender: TObject);
var
  hRadio,hDeviceFind : THANDLE;
  hfind : HBLUETOOTH_RADIO_FIND;
  btfrp : TBlueToothFindRadioParams;
  radioInfo : BLUETOOTH_RADIO_INFO;
  deviceInfo : BLUETOOTH_DEVICE_INFO;
  deviceSearchParams : BLUETOOTH_DEVICE_SEARCH_PARAMS;
  Err, x : integer;
begin
  Memo1.Lines.Clear;
  x := 0;
  RefreshBtDevices;
  try
   try
    btfrp.dwSize := sizeof(btfrp);
    hFind := BluetoothFindFirstRadio(@btfrp, hRadio);
    BluetoothEnableDiscovery(hRadio,True);
    if (hFind > 0) then begin
      repeat
        BluetoothEnableDiscovery(hRadio,True);
        radioInfo.dwSize := sizeof(radioInfo);
        if (ERROR_SUCCESS = BluetoothGetRadioInfo(hRadio, radioInfo))
         then Memo1.Lines.Add('Radio: '+ radioInfo.szName)
         else Memo1.Lines.Add('unknown error');
        deviceInfo.dwSize := sizeof(deviceInfo);
        deviceSearchParams.dwSize := sizeof(deviceSearchParams);
        deviceSearchParams.fReturnUnknown := true;
        deviceSearchParams.fReturnRemembered := true;
        deviceSearchParams.hRadio := hRadio;
        hDeviceFind := BluetoothFindFirstDevice(deviceSearchParams, deviceInfo);
        BluetoothUpdateDeviceRecord(deviceInfo);
        Memo1.Lines.Add('Device: '+deviceInfo.szName);
        if deviceInfo.fConnected then Memo1.Lines.Add('Device is connected')
         else Memo1.Lines.Add('Device is not connected');
        try
          Memo1.Lines.Add('Last seen: '+ DateTimeToStr(SystemTimeToDateTime(deviceInfo.stLastSeen)));
        except

        end;
        try
          Memo1.Lines.Add('Class of Device: ' + IntToStr(deviceInfo.ulClassofDevice));
        except

        end;
        if (hDeviceFind>0) then begin
           while(BluetoothFindNextDevice(hDeviceFind, deviceInfo))
           do begin
              BluetoothGetDeviceInfo(hRadio, deviceInfo);
              BluetoothUpdateDeviceRecord(deviceInfo);
              Memo1.Lines.Add('Device: '+deviceInfo.szName);
              if deviceInfo.fConnected then Memo1.Lines.Add('Device is connected')
               else Memo1.Lines.Add('Device is not connected');
              try
                Memo1.Lines.Add('Last seen: '+ DateTimeToStr(SystemTimeToDateTime(deviceInfo.stLastSeen)));
              except
              
              end;
              try
                Memo1.Lines.Add('Class of Device: ' + IntToStr(deviceInfo.ulClassofDevice));
              except

              end;
           end;
           BluetoothFindDeviceClose(hDeviceFind);
        end;
        x := x+1;
      until
        (BluetoothFindNextRadio(hFind, hRadio)) or (x > 0);
      BluetoothFindRadioClose(hFind);
    end
    else begin
      Err := GetLastError;
      Memo1.Lines.Add(SysErrorMessage(Err)+' ('+inttostr(Err)+')');
    end;
   except
    on E:Exception do Memo1.Lines.Add('error'+e.Message);
   end;
  finally

  end;
end;
hier hab ich aber das Problem dann das nur die zuletzt gefundeenn geräte angezeigt werden, er aktualisiert diese nicht. Also wenn ich bei meinem Handy Bluetooth anschalte, muß ich erstmal in der windows bluetooth geräte suchen funktion kurz mal reinschaun und erst dann findet mein prog das gerät auch.
Dann habe ich das hier noch gefunden/bzw zusammengebastelt:

Delphi-Quellcode:
procedure TForm1.RefreshBtDevices;
var
  ASelParams: BLUETOOTH_SELECT_DEVICE_PARAMS;
  ASelParamsSize: dword;
begin
  ASelParamsSize := SizeOf(BLUETOOTH_SELECT_DEVICE_PARAMS);
  FillChar(ASelParams, ASelParamsSize, 0);
  with ASelParams do begin
    dwSize := ASelParamsSize;
    hwndParent := handle;
    fShowRemembered := False;
    fAddNewDeviceWizard := False;
    fShowUnknown := True;
    fShowAuthenticated := True;
    fSkipServicesPage := True;
    fForceAuthentication := False;
    cNumOfClasses := 0;
    cNumDevices := 0;
  end;
  XCounter := 0;
  fAbort := False;
  tHideBTWIndow.Create(False);
  BluetoothSelectDevices(@ASelParams);
  BluetoothSelectDevicesFree(@ASelParams);
  fAbort := True;
end;

procedure tHideBTWIndow.Execute;
var
 TheWindowHandle: THandle;
begin
  priority := tpHigher;
  try
    while not Form1.fAbort do begin
     TheWindowHandle := FindAWindow('Bluetooth-Gerät auswählen', '');
     if TheWindowHandle<>0 then ShowWindow(TheWindowHandle,sw_Hide);
     if TheWindowHandle<>0 then PostMessage(TheWindowHandle,WM_CLOSE, 0, 0);
    end;
  except

  end;
end;
damit kann ich nun die Geräte aktualisieren, es erscheint dann immer das Windows BT Geräte suchen fenster, was ich mit einem Thread Schleisse. .... Sehr unschön so würd ich mal sagen. Kann ich irgendwie anders Windows sagen das es JETZT SOFORT nach neuen Bluetoot Geräten suchen soll? Wäre toll wenn mir jemand einen Tipp geben könnte.

Gruß tom
Tom
Just DO it

Geändert von Cylence ( 7. Feb 2011 um 09:04 Uhr)
  Mit Zitat antworten Zitat