2013年4月18日 星期四

透過Windows 8 藍芽驅動程式來開關電腦的藍芽

想在Windows 8 直接控制驅動程式來開關電腦的藍芽(Bluetooth)嗎?
根據微軟官網的範例說明,廠商在設計Windows8的藍芽驅動程式,都需要預留一組通用的控制介面,分別是負責藍芽開關(BluetoothEnableRadio)、負責確認藍芽狀態(IsBluetoothRadioEnabled),這組廠商所寫通用控制介面,我們就可以使用自己寫好的程式去控制Bluetooth,不過還有個前提就是必須安裝驅動程式才行。
範例說明如下
  1. 開啟登錄檔。
  2. 找"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BTHPORT\Parameters\Radio Support"路徑下的"SupportDLL"。
  3. 取得電腦上DLL完整路徑。
  4. 載入DLL,使用DLL中的BluetoothEnableRadio、IsBluetoothRadioEnabled函數。
將上述做法轉換成程式碼
#include "stdafx.h"
#include <Shlwapi.h>
#pragma comment(lib, "Shlwapi.lib")

typedef DWORD (WINAPI * DLL_BluetoothEnableRadio)(BOOL fEnable);
DLL_BluetoothEnableRadio BluetoothEnableRadio;
typedef DWORD (WINAPI * DLL_IsBluetoothRadioEnabled)(BOOL* pfEnabled);
DLL_IsBluetoothRadioEnabled IsBluetoothRadioEnabled;

int _tmain(int argc, TCHAR* argv[])
{
 HKEY hk;
 LONG lreturn;
 CHAR cDLLPath[200];
 DWORD dwLen = 200;
 HINSTANCE hDLL = NULL;
 BOOL fEnabled;

 lreturn = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
       "SYSTEM\\CurrentControlSet\\Services\\BTHPORT\\Parameters\\Radio Support",
       0, 
       KEY_READ, 
       &hk);

 if(lreturn==ERROR_SUCCESS)
 { 
  ZeroMemory(cDLLPath, sizeof(cDLLPath));
  lreturn = RegQueryValueEx(HKEY_LOCAL_MACHINE, 
         "SupportDLL", 
         NULL,
         NULL,
         (UCHAR*)cDLLPath, 
         &dwLen);
  if(lreturn==ERROR_SUCCESS)
  {
   ZeroMemory(cDLLPath, sizeof(cDLLPath));

   //轉換路徑%SystemRoot% => C:\Windows
   lreturn = SHRegGetPath(HKEY_LOCAL_MACHINE,
      "SYSTEM\\CurrentControlSet\\Services\\BTHPORT\\Parameters\\Radio Support", 
      "SupportDLL", 
      cDLLPath, 
      0);
   if(lreturn==ERROR_SUCCESS)
   {
    hDLL = LoadLibrary(cDLLPath);
    if (hDLL == NULL)
    {
     printf("Error load Bluetooth dll fail. %08X\n", GetLastError());
     RegCloseKey(hk);
     return FALSE;
    }

    BluetoothEnableRadio = (DLL_BluetoothEnableRadio)GetProcAddress(hDLL, "BluetoothEnableRadio");
    if (!BluetoothEnableRadio)
    {
     printf("Error BluetoothEnableRadio fail. %08X\n", GetLastError()); 
     FreeLibrary(hDLL);
     RegCloseKey(hk);
     return FALSE;
    }

    IsBluetoothRadioEnabled = (DLL_IsBluetoothRadioEnabled)GetProcAddress(hDLL, "IsBluetoothRadioEnabled");
    if (!IsBluetoothRadioEnabled)
    {     
     printf("Error IsBluetoothRadioEnabled fail. %08X\n", GetLastError()); 
     FreeLibrary(hDLL);
     RegCloseKey(hk);
     return FALSE;
    }

    IsBluetoothRadioEnabled(&fEnabled);
    printf("BT status : %s\n", fEnabled ? "Enable" : "Disable");
    BluetoothEnableRadio(atoi(argv[1]));

    
    Sleep(4000);//等待BT反應
    IsBluetoothRadioEnabled(&fEnabled);
    printf("BT status : %s\n", fEnabled ? "Enable" : "Disable");
   }   
  }
  else
  {
   printf("\"SupportDLL\" is not exist.\n");
   RegCloseKey(hk);
   return FALSE;
  }
 }
 else
 {
  printf("\"HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\BTHPORT\\Parameters\\Radio Support\" is not exist.\n");
  return FALSE;
 }

 RegCloseKey(hk); 
 return TRUE;
}

沒有留言:

張貼留言