1. 程式人生 > >用藍芽耳機播放鍵啟用PC小娜

用藍芽耳機播放鍵啟用PC小娜

如果我們想喚醒隔壁房間Win10 PC上的小娜,為我們播放一首喜歡的歌曲,(我喜歡的是《最初的信仰》)大聲呼叫“你好,小娜”,多少有些擾民,(當然如果你的麥克風夠靈敏、夠多,請關閉這個頁面。)因此我嘗試使用藍芽耳機播放鍵啟用小娜,下達語音指令,實現“遠距離”語音控制。

我很慶幸,網易雲音樂UWP版本的藍芽耳機控制音樂的播放/暫停/換歌,為我的嘗試提供了理論支撐。

一、基本過程

1、利用  RegisterWindowMessage 註冊自定義監聽訊息 SHELLHOOK。

2、利用  RegisterShellHookWindow 註冊監聽該自定義訊息的視窗。

3、在2中視窗的 WindowProc 函式中捕捉播放/暫停 按鍵,並激活小娜。

4、啟用小娜可以用 ShellExecute 執行小娜的快捷方式,再用keybd_event傳送按鍵;

      也可以直接模擬 Win+Shift+C 組合鍵喚醒小娜(有些防毒軟體會遮蔽對WIN鍵的模擬)。

二、關鍵程式碼

//監聽並激活小娜
LRESULT CActiveCortanaDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{
	// TODO: Add your specialized code here and/or call the base class


	
	if(message == WM_SHELLHOOKMESSAGE)//WM_APPCOMMAND)
	{

	if(wParam==WM_APPCOMMAND){


      switch (GET_APPCOMMAND_LPARAM(lParam))
      {
      case APPCOMMAND_MEDIA_PLAY_PAUSE:
         AfxMessageBox("PLAY_PAUSE");
         return TRUE;

	  case APPCOMMAND_MEDIA_PLAY:
	
         TCHAR szBuf[MAX_PATH];
         ZeroMemory(szBuf,MAX_PATH);
		 GetCurrentDirectory(MAX_PATH,szBuf);
	     ShellExecute(NULL,"open",CString(szBuf)+"//Cortana.lnk",NULL,NULL,SW_SHOWNORMAL); 
		 Sleep(500);
         keybd_event(VK_TAB,0,0,0);   //按下TAB鍵 
		 keybd_event(VK_TAB,0,KEYEVENTF_KEYUP,0);//鬆開TAB鍵
		 keybd_event(VK_RETURN,0,0,0);   //按下ENTER鍵		 
		 keybd_event(VK_RETURN,0,KEYEVENTF_KEYUP,0);//鬆開ENTER鍵		
	     
         return TRUE;


	  case APPCOMMAND_MEDIA_PAUSE:
      	
         ZeroMemory(szBuf,MAX_PATH);
		 GetCurrentDirectory(MAX_PATH,szBuf);   
         ShellExecute(NULL,"open",CString(szBuf)+"//Cortana.lnk",NULL,NULL,SW_SHOWNORMAL); 
	     Sleep(500);
         keybd_event(VK_TAB,0,0,0);   //按下TAB鍵 
		 keybd_event(VK_TAB,0,KEYEVENTF_KEYUP,0);//鬆開TAB鍵
		 keybd_event(VK_RETURN,0,0,0);   //按下ENTER鍵		 
		 keybd_event(VK_RETURN,0,KEYEVENTF_KEYUP,0);//鬆開ENTER鍵		
         return TRUE;

      case APPCOMMAND_MEDIA_STOP:
      //  AfxMessageBox("STOP");
         return TRUE;

      case APPCOMMAND_MEDIA_PREVIOUSTRACK:
       //  AfxMessageBox("PREVIOUSTRACK");
         return TRUE;

      case APPCOMMAND_MEDIA_NEXTTRACK:
       //   AfxMessageBox("NEXTTRACK");
         return TRUE;
      }
		}
	}

	return CDialog::WindowProc(message, wParam, lParam);
}

三、檔案下載地址