如果我们想唤醒隔壁房间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);
}
三、文件下载地址