📄 btcp.cxx
字号:
++*pp;
++iDig;
}
if (iDig > nDigs)
return FALSE;
switch (nDigs) {
case 2:
*(unsigned char *)pRes = (unsigned char)iRes;
break;
case 4:
*(unsigned short *)pRes = (unsigned short)iRes;
break;
case 8:
*(unsigned int *)pRes = (unsigned int)iRes;
break;
}
return TRUE;
}
int GetUx2 (WCHAR **pp, void *pRes, int nDigs) {
int iDig = 0;
int iRes = 0;
while (iswxdigit (**pp) && (iDig < nDigs)) {
int c = **pp;
if (c >= 'a')
c = c - 'a' + 0xa;
else if (c >= 'A')
c = c - 'A' + 0xa;
else c = c - '0';
if ((c < 0) || (c > 16))
return FALSE;
iRes = iRes * 16 + c;
++*pp;
++iDig;
}
switch (nDigs) {
case 2:
*(unsigned char *)pRes = (unsigned char)iRes;
break;
case 4:
*(unsigned short *)pRes = (unsigned short)iRes;
break;
case 8:
*(unsigned int *)pRes = (unsigned int)iRes;
break;
}
return TRUE;
}
int GetBA (WCHAR **pp, BT_ADDR *pba) {
unsigned short x;
unsigned int y;
if (! GetUx2 (pp, &x, 4))
return FALSE;
if (! GetUx2 (pp, &y, 8))
return FALSE;
*pba = SET_NAP_SAP (x, y);
return TRUE;
}
void Refresh (void) {
WCHAR szLine[_MAX_PATH];
unsigned int page = 0;
unsigned int cod = 0;
unsigned int auth = ((SendMessage (GetDlgItem (ghWnd, IDC_SECURE_ONLY), BM_GETCHECK, 0, 0) == BST_CHECKED) ? 1 : 0);
unsigned int scan = ((SendMessage (GetDlgItem (ghWnd, IDC_DISCOVERABLE), BM_GETCHECK, 0, 0) == BST_CHECKED) ? 1 : 0) |
((SendMessage (GetDlgItem (ghWnd, IDC_CONNECTABLE), BM_GETCHECK, 0, 0) == BST_CHECKED) ? 2 : 0);
szLine[0] = '\0';
GetWindowText (GetDlgItem (ghWnd, IDC_PAGE), szLine, _MAX_PATH);
WCHAR *p = szLine;
if (! GetDI (&p, &page)) {
page = gPage;
wsprintf (szLine, L"%d", gPage);
SetWindowText (GetDlgItem (ghWnd, IDC_PAGE), szLine);
}
szLine[0] = '\0';
GetWindowText (GetDlgItem (ghWnd, IDC_COD), szLine, _MAX_PATH);
p = szLine;
if (! GetUx (&p, &cod, 8)) {
cod = gCod;
wsprintf (szLine, L"0x%06x", gCod);
SetWindowText (GetDlgItem (ghWnd, IDC_COD), szLine);
}
if (auth != gAuth)
BthWriteAuthenticationEnable ((unsigned char)auth);
if (scan != gScan)
BthWriteScanEnableMask ((unsigned char)scan);
if (page != gPage)
BthWritePageTimeout ((unsigned short)page);
if (cod != gCod)
BthWriteCOD (cod);
FillParameters (NULL);
}
#define MAX_CONNECTIONS 20
static void RefreshActive (HWND hWnd) {
HWND hLB = GetDlgItem (hWnd, IDC_CONNECTION_LIST);
for ( ; ; ) { // Clean up
int res = SendMessage (hLB, LB_GETCOUNT, 0, 0);
if (res == LB_ERR)
return;
if (res == 0)
break;
SendMessage (hLB, LB_DELETESTRING, 0, 0);
}
int cConnections = 0;
BASEBAND_CONNECTION pConnections[MAX_CONNECTIONS];
if (ERROR_SUCCESS != BthGetBasebandConnections (MAX_CONNECTIONS, pConnections, &cConnections)) {
MessageBox (hWnd, L"Information request failed", L"Error", MB_OK | MB_TOPMOST);
}
else {
for (int i = 0 ; i < cConnections ; ++i) {
if (pConnections[i].fLinkType == BTH_LINK_TYPE_ACL) {
WCHAR sz[20];
wsprintf (sz, L"%04x%08x", GET_NAP(pConnections->baAddress), GET_SAP(pConnections->baAddress));
SendMessage (hLB, LB_ADDSTRING, 0, (LPARAM)sz);
}
}
}
}
static int GetCurrentBt (HWND hWnd, BT_ADDR *pbt) {
HWND hLB = GetDlgItem (hWnd, IDC_CONNECTION_LIST);
int iSel = SendMessage (hLB, LB_GETCURSEL, 0, 0);
WCHAR szBuf[25];
WCHAR *p = szBuf;
if (iSel == LB_ERR)
return FALSE;
if (SendMessage (hLB, LB_GETTEXTLEN, iSel, 0) >
sizeof(szBuf) / sizeof(szBuf[0]))
return FALSE;
if (LB_ERR == SendMessage (hLB, LB_GETTEXT, iSel, (LPARAM)szBuf))
return FALSE;
return GetBA (&p, pbt);
}
static void RefreshCurrent (HWND hWnd) {
EnableWindow (GetDlgItem (hWnd, IDC_LP_MS_SWITCH), FALSE);
EnableWindow (GetDlgItem (hWnd, IDC_LP_ENABLE_HOLD), FALSE);
EnableWindow (GetDlgItem (hWnd, IDC_LP_ENABLE_SNIFF), FALSE);
EnableWindow (GetDlgItem (hWnd, IDC_LP_ENABLE_PARK), FALSE);
EnableWindow (GetDlgItem (hWnd, IDC_STATE_NORMAL), FALSE);
EnableWindow (GetDlgItem (hWnd, IDC_STATE_HOLD), FALSE);
EnableWindow (GetDlgItem (hWnd, IDC_STATE_SNIFF), FALSE);
EnableWindow (GetDlgItem (hWnd, IDC_STATE_PARK), FALSE);
SendMessage (GetDlgItem (hWnd, IDC_LP_MS_SWITCH), BM_SETCHECK, BST_UNCHECKED, 0);
SendMessage (GetDlgItem (hWnd, IDC_LP_ENABLE_HOLD), BM_SETCHECK, BST_UNCHECKED, 0);
SendMessage (GetDlgItem (hWnd, IDC_LP_ENABLE_SNIFF), BM_SETCHECK, BST_UNCHECKED, 0);
SendMessage (GetDlgItem (hWnd, IDC_LP_ENABLE_PARK), BM_SETCHECK, BST_UNCHECKED, 0);
SendMessage (GetDlgItem (hWnd, IDC_STATE_NORMAL), BM_SETCHECK, BST_UNCHECKED, 0);
SendMessage (GetDlgItem (hWnd, IDC_STATE_HOLD), BM_SETCHECK, BST_UNCHECKED, 0);
SendMessage (GetDlgItem (hWnd, IDC_STATE_SNIFF), BM_SETCHECK, BST_UNCHECKED, 0);
SendMessage (GetDlgItem (hWnd, IDC_STATE_PARK), BM_SETCHECK, BST_UNCHECKED, 0);
BT_ADDR bt;
if (! GetCurrentBt (hWnd, &bt))
return;
unsigned short lps = 0;
if (BthReadLinkPolicySettings (&bt, &lps) == ERROR_SUCCESS) {
EnableWindow (GetDlgItem (hWnd, IDC_LP_MS_SWITCH), TRUE);
EnableWindow (GetDlgItem (hWnd, IDC_LP_ENABLE_HOLD), TRUE);
EnableWindow (GetDlgItem (hWnd, IDC_LP_ENABLE_SNIFF), TRUE);
EnableWindow (GetDlgItem (hWnd, IDC_LP_ENABLE_PARK), TRUE);
if (lps & 1)
SendMessage (GetDlgItem (hWnd, IDC_LP_MS_SWITCH), BM_SETCHECK, BST_CHECKED, 0);
if (lps & 2)
SendMessage (GetDlgItem (hWnd, IDC_LP_ENABLE_HOLD), BM_SETCHECK, BST_CHECKED, 0);
if (lps & 4)
SendMessage (GetDlgItem (hWnd, IDC_LP_ENABLE_SNIFF), BM_SETCHECK, BST_CHECKED, 0);
if (lps & 8)
SendMessage (GetDlgItem (hWnd, IDC_LP_ENABLE_PARK), BM_SETCHECK, BST_CHECKED, 0);
}
unsigned char mode = 0;
if (BthGetCurrentMode (&bt, &mode) == ERROR_SUCCESS) {
// EnableWindow (GetDlgItem (hWnd, IDC_STATE_NORMAL), TRUE);
// EnableWindow (GetDlgItem (hWnd, IDC_STATE_HOLD), TRUE);
// EnableWindow (GetDlgItem (hWnd, IDC_STATE_SNIFF), TRUE);
// EnableWindow (GetDlgItem (hWnd, IDC_STATE_PARK), TRUE);
if (mode == 0)
SendMessage (GetDlgItem (hWnd, IDC_STATE_NORMAL), BM_SETCHECK, BST_CHECKED, 0);
if (mode == 1)
SendMessage (GetDlgItem (hWnd, IDC_STATE_HOLD), BM_SETCHECK, BST_CHECKED, 0);
if (mode == 2)
SendMessage (GetDlgItem (hWnd, IDC_STATE_SNIFF), BM_SETCHECK, BST_CHECKED, 0);
if (mode == 3)
SendMessage (GetDlgItem (hWnd, IDC_STATE_PARK), BM_SETCHECK, BST_CHECKED, 0);
}
}
static BOOL CALLBACK ActiveDlgProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
switch (uMsg) {
case WM_INITDIALOG:
SetForegroundWindow (hWnd);
SetFocus (GetDlgItem (hWnd, IDC_CONNECTION_LIST));
RefreshActive (hWnd);
return 0;
case WM_COMMAND:
{
int wID = LOWORD(wParam);
switch (wID)
{
case IDC_CONNECTION_LIST:
if (HIWORD(wParam) == LBN_SELCHANGE)
RefreshCurrent (hWnd);
break;
case IDOK:
case IDCANCEL:
EndDialog (hWnd, TRUE);
return 0;
case IDC_LP_MS_SWITCH:
case IDC_LP_ENABLE_HOLD:
case IDC_LP_ENABLE_SNIFF:
case IDC_LP_ENABLE_PARK:
{
HWND hItem = GetDlgItem (hWnd, wID);
unsigned short lps = 0;
if (SendMessage (GetDlgItem (hWnd, IDC_LP_MS_SWITCH), BM_GETCHECK, 0, 0) == BST_CHECKED)
lps |= 1;
if (SendMessage (GetDlgItem (hWnd, IDC_LP_ENABLE_HOLD), BM_GETCHECK, 0, 0) == BST_CHECKED)
lps |= 2;
if (SendMessage (GetDlgItem (hWnd, IDC_LP_ENABLE_SNIFF), BM_GETCHECK, 0, 0) == BST_CHECKED)
lps |= 4;
if (SendMessage (GetDlgItem (hWnd, IDC_LP_ENABLE_PARK), BM_GETCHECK, 0, 0) == BST_CHECKED)
lps |= 8;
BT_ADDR bt;
if (GetCurrentBt (hWnd, &bt)) {
BthWriteLinkPolicySettings (&bt, lps);
RefreshCurrent (hWnd);
}
break;
}
case IDC_STATE_NORMAL:
case IDC_STATE_HOLD:
case IDC_STATE_SNIFF:
case IDC_STATE_PARK:
{
SendMessage (GetDlgItem (hWnd, IDC_STATE_NORMAL), BM_SETCHECK, BST_UNCHECKED, 0);
SendMessage (GetDlgItem (hWnd, IDC_STATE_HOLD), BM_SETCHECK, BST_UNCHECKED, 0);
SendMessage (GetDlgItem (hWnd, IDC_STATE_SNIFF), BM_SETCHECK, BST_UNCHECKED, 0);
SendMessage (GetDlgItem (hWnd, IDC_STATE_PARK), BM_SETCHECK, BST_UNCHECKED, 0);
SendMessage (GetDlgItem (hWnd, wID), BM_SETCHECK, BST_CHECKED, 0);
unsigned char mode = 0;
if (SendMessage (GetDlgItem (hWnd, IDC_STATE_NORMAL), BM_GETCHECK, 0, 0) == BST_CHECKED)
mode = 0;
else if (SendMessage (GetDlgItem (hWnd, IDC_STATE_HOLD), BM_GETCHECK, 0, 0) == BST_CHECKED)
mode = 1;
else if (SendMessage (GetDlgItem (hWnd, IDC_STATE_SNIFF), BM_GETCHECK, 0, 0) == BST_CHECKED)
mode = 2;
else if (SendMessage (GetDlgItem (hWnd, IDC_STATE_PARK), BM_GETCHECK, 0, 0) == BST_CHECKED)
mode = 3;
BT_ADDR bt;
if (GetCurrentBt (hWnd, &bt)) {
unsigned char oldmode = 0;
if (ERROR_SUCCESS != BthGetCurrentMode (&bt, &oldmode))
break;
if (oldmode == mode)
break;
}
RefreshCurrent (hWnd);
break;
}
case IDC_REFRESH:
RefreshActive (hWnd);
RefreshCurrent (hWnd);
break;
}
}
break;
}
return 0;
}
static BOOL CALLBACK DlgProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
switch (uMsg) {
case WM_INITDIALOG:
ghWnd = hWnd;
SetForegroundWindow (hWnd);
SetFocus (GetDlgItem (hWnd, IDC_OK));
SendMessage(GetDlgItem(hWnd, IDC_DESCR), LB_SETHORIZONTALEXTENT, 250, 0);
CloseHandle (CreateThread (NULL, 0, FillParameters, NULL, 0, NULL));
return 0;
case WM_COMMAND:
{
int wID = LOWORD(wParam);
switch (wID)
{
case IDC_OK:
EndDialog (hWnd, TRUE);
return 0;
case IDC_EXIT:
case IDCANCEL:
EndDialog (hWnd, FALSE);
return 0;
case IDC_STARTSTOP:
StartStop ();
break;
case IDC_ACTIVE:
DialogBox (ghInst, MAKEINTRESOURCE (IDD_ACTIVE), NULL, ActiveDlgProc);
break;
case IDC_REFRESH:
Refresh ();
}
}
break;
}
return 0;
}
#if defined (DO_DEVICE_CONTROL)
LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
switch (message) {
case WM_CREATE:
return 0;
case WM_DESTROY:
PostQuitMessage (0);
break;
case WM_USER + 1:
if (lParam == WM_LBUTTONDOWN) {
if (ghWnd) {
SetForegroundWindow (ghWnd);
break;
}
if (! DialogBox (ghInst, MAKEINTRESOURCE (IDD_MAINBOX), NULL, DlgProc)) {
NOTIFYICONDATA nid;
memset (&nid, 0, sizeof(nid));
nid.cbSize = sizeof(NOTIFYICONDATA);
nid.hWnd = hWnd;
nid.uID = 1;
Shell_NotifyIcon (NIM_DELETE, &nid);
DestroyWindow (hWnd);
}
ghWnd = NULL;
}
break;
case WM_USER + 2:
DialogBoxParam (ghInst, MAKEINTRESOURCE (IDD_ENTERPIN), NULL, DlgProc2, lParam);
LocalFree ((void *)lParam);
break;
case WM_USER + 3:
FillFromRegistry ();
break;
case WM_USER + 5:
{
if (ghWnd) {
SetForegroundWindow (ghWnd);
break;
}
NOTIFYICONDATA nid;
memset (&nid, 0, sizeof(nid));
nid.cbSize = sizeof(NOTIFYICONDATA);
nid.hWnd = hWnd;
nid.uID = 1;
Shell_NotifyIcon (NIM_DELETE, &nid);
DestroyWindow (hWnd);
}
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return FALSE;
}
DWORD WINAPI SecurityUI (LPVOID lpVoid) {
HANDLE ah[2];
ah[0] = ghEvent;
ah[1] = CreateEvent (NULL, TRUE, FALSE, BTH_NAMEDEVENT_HARDWARE_CHANGED);
for ( ; ; ) {
DWORD dwRes = WaitForMultipleObjects (ah[1] ? 2 : 1, ah, FALSE, INFINITE);
if ((WAIT_OBJECT_0 != dwRes) && ((WAIT_OBJECT_0+1) != dwRes))
break;
if (gExit)
break;
BT_ADDR bt;
while (ERROR_SUCCESS == BthGetPINRequest (&bt)) {
pin_request *p = (pin_request *)LocalAlloc (LMEM_FIXED, sizeof(pin_request));
p->bt = bt;
p->hWnd = NULL;
PostMessage (ghWndHidden, WM_USER + 2, 0, (LPARAM)p);
}
if (dwRes == (WAIT_OBJECT_0+1))
PostMessage (ghWndHidden, WM_USER + 3, 0, NULL);
}
if (ah[1])
CloseHandle (ah[1]);
return 0;
}
#endif
int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrev, LPWSTR lpszCmdLine, int nCmdShow) {
for (int i = 0 ; (i < 10) && (! IsAPIReady(SH_WMGR)); ++i) //Wait for shell
Sleep(1000);
ghInst = hInst;
gExit = FALSE;
#if defined (DO_DEVICE_CONTROL)
#if defined (SDK_BUILD)
HMODULE hMod = LoadLibrary (L"aygshell.dll");
if (hMod)
gpSHInputDialog = (tSHInputDialog)GetProcAddress (hMod, L"SHInputDialog");
#endif
ghEvent = CreateEvent (NULL, FALSE, FALSE, NULL);
int fSecUISet = ERROR_SUCCESS != BthSetSecurityUI (ghEvent, 60000, 120000);
CloseHandle (CreateThread (NULL, 0, SecurityUI, NULL, 0, NULL));
WNDCLASS wc;
memset (&wc, 0, sizeof(wc));
wc.lpfnWndProc = WndProc;
wc.hInstance = hInst;
wc.lpszClassName = APPNAME;
if (! RegisterClass (&wc))
return 0;
ghWndHidden = CreateWindow (APPNAME, APPNAME, WS_DISABLED,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInst, NULL);
NOTIFYICONDATA nid;
memset (&nid, 0, sizeof(nid));
nid.cbSize = sizeof(NOTIFYICONDATA);
nid.hWnd = ghWndHidden;
nid.uID = 1;
nid.uFlags = NIF_ICON | NIF_MESSAGE;
nid.uCallbackMessage = WM_USER + 1;
nid.hIcon = (HICON)LoadImage(hInst, MAKEINTRESOURCE(IDI_BTHICON), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR);
if (wcsstr (lpszCmdLine, L"/noicon") == 0)
Shell_NotifyIcon (NIM_ADD, &nid);
FillFromRegistry ();
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage (&msg) ;
DispatchMessage(&msg);
}
gExit = TRUE;
SetEvent (ghEvent);
CloseHandle (ghEvent);
if (fSecUISet)
BthSetSecurityUI (NULL, 0, 0);
#else
HWND hWnd = FindWindow (L"dialog", L"Bluetooth Control");
if (hWnd)
SetForegroundWindow (hWnd);
else
DialogBox (ghInst, MAKEINTRESOURCE (IDD_MAINBOX), NULL, DlgProc);
gExit = TRUE;
#endif
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -