我需要连接的蓝牙串行设备。我可以通过
查询WMI数据库以找到我需要的蓝牙端口HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM\Device\BthModem0
或通过检查
使用注册表{{1}}
但是我无法找到一个公开的API,它允许我确定两个创建的虚拟COM端口中的哪一个是传入和传出的。
如果您在设备管理器中挖掘得足够深,那么这些信息会显示在Windows上,因此我应该可以使用(通过PInvoke或其他东西?)但是我需要找到一种从WPF应用程序以编程方式找到它的方法。 / p>
答案 0 :(得分:0)
您正在寻找的是获得设备功能。
我已经创建了一个示例C ++示例,它根据以下example执行您所需的操作。您需要使用PINVOKE来调用适当的方法。对不起,我不能提供C#代码作为我的工作。
这取决于Microsoft蓝牙堆栈。您需要对widcomm或Toshiba蓝牙堆栈进行一些修改。
您可以从Github
中提取样本要使其工作,您需要将以下内容添加到链接器选项
Setupapi.lib Ole32.lib
#include "stdafx.h"
#include <stdio.h>
#include <windows.h>
#include <setupapi.h>
#include <devguid.h>
#include <regstr.h>
#include "Objbase.h"
int main(int argc, char *argv[], char *envp[])
{
HDEVINFO hDevInfo;
SP_DEVINFO_DATA DeviceInfoData;
DWORD i;
CLSID guid;
//Class = Ports
//ClassGuid = { 4d36e978 - e325 - 11ce - bfc1 - 08002be10318}
LPCOLESTR guidString = L"{86E0D1E0-8089-11D0-9CE4-08003E301F73}";
HRESULT a = CLSIDFromString(guidString, &guid);
// Create a HDEVINFO with all present devices.
hDevInfo = SetupDiGetClassDevs(&guid,
0, // Enumerator
0,
DIGCF_DEVICEINTERFACE);
if (hDevInfo == INVALID_HANDLE_VALUE)
{
// Insert error handling here.
return 1;
}
// Enumerate through all devices in Set.
DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
for (i = 0;SetupDiEnumDeviceInfo(hDevInfo, i,
&DeviceInfoData);i++)
{
DWORD DataT;
LPTSTR buffer = (LPTSTR)LocalAlloc(LPTR, 4096 * 2);
DWORD buffersize = 4096;
LPBYTE buffer2 = (LPBYTE)LocalAlloc(LPTR, 4096 * 2);
SetupDiGetDeviceRegistryProperty(
hDevInfo,
&DeviceInfoData,
SPDRP_FRIENDLYNAME,
&DataT,
(PBYTE)buffer,
buffersize,
&buffersize);
if (wcsstr(buffer, L"Standard Serial over Bluetooth link"))
{
SetupDiGetDeviceRegistryProperty(
hDevInfo,
&DeviceInfoData,
SPDRP_CAPABILITIES,
&DataT,
(PBYTE)buffer2,
buffersize,
&buffersize);
wprintf(L"Result:%s - ", buffer);
int a = *buffer2;
if (a == 0xC0)
{
wprintf(L"Incoming");
}
else if (a == 0xC4)
{
wprintf(L"Outgoing");
}
wprintf(L"\n", buffer);
}
if (buffer) LocalFree(buffer);
}
if (GetLastError() != NO_ERROR &&
GetLastError() != ERROR_NO_MORE_ITEMS)
{
// Insert error handling here.
return 1;
}
// Cleanup
SetupDiDestroyDeviceInfoList(hDevInfo);
getchar();
return 0;
}