最新消息

[公告2014/05/30] 如有需要將部落格中,任何一篇文章的程式碼使用在商業用途,請與我聯繫。

[公告2015/04/26] Line版的 iInfo程式與投資應用 群組已上線想加入的朋友們,請先查看 "入群須知" 再與我聯繫 Line : aminwhite5168,加入請告知身分與回答 "入群須知" 的問題。

[公告2018/04/22] 台北 Python + Excel VBA 金融資訊爬蟲課程,課程如網頁內容 金融資訊爬蟲班:台北班 Python 金融資訊爬蟲、EXCEL VBA 金融資訊爬蟲

[公告2019/01/08] 請注意:我再次重申,部落格文章的程式碼,是要提供各位參考與學習,一旦網頁改版請自行修改,別要求東要求西要我主動修改,你們用我寫東西賺錢了、交差了,請問有分我一杯羹嗎?既然賺錢沒分我,請問有什麼理由要求我修改,如果沒能力改,就花錢來找我上課。

[公告2019/12/01] 若各位有 Excel VBA 案子開發需求,歡迎與我聯繫,可接案處理。

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;
}

沒有留言:

張貼留言