我最近面对着需要使用降噪耳机来隔绝周围的噪声,但是长时间使用电脑时听不见自己的鼠标和键盘声,没有声音的反馈而感到难受。所以,我就想鼠标点击在耳机中播放相应音效(示例是.wav文件)是否会有一些帮助。以下是一种可用的代码,(本代码使用了SFML库,需要自己安装,这个库大概有10M,用来处理音频的,可以自行选择其他适合的处理方式并编写相应代码)
#include <SFML/Audio.hpp>
#include <iostream>
#include <Windows.h>
#include <thread>
#include <mutex>
std::mutex mtx;
sf::SoundBuffer buffer;
sf::Sound sound;
void playSound() {
mtx.lock();
mtx.unlock();
sound.stop(); // 停止当前正在播放的音频
sound.setPlayingOffset(sf::Time::Zero); // 重置播放位置
sound.play(); // 播放音频
}
LRESULT CALLBACK MouseHookCallback(int nCode, WPARAM wParam, LPARAM lParam) {
if (nCode >= 0) {
if (wParam == WM_LBUTTONDOWN) {
std::thread soundThread(playSound);
soundThread.detach();
}
}
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
int main() {
HINSTANCE hInstance = GetModuleHandle(NULL);
HHOOK mouseHook = SetWindowsHookEx(WH_MOUSE_LL, MouseHookCallback, hInstance, 0);
if (!buffer.loadFromFile("split.wav")) {
std::cout << "Failed to load sound file" << std::endl;
return -1;
}
sound.setBuffer(buffer);
MSG msg;
while (GetMessage(&msg, NULL, 0, 0) > 0) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
UnhookWindowsHookEx(mouseHook);
return 0;
}
核心就是使用SetWindowsHookEx
函数与操作系统进行交互,来获取鼠标的信息。
音效的话,wav格式和mp3格式都行,只要把相应地方换成自己的路径就行了。
作者声明,本文为一篇烂文,仅仅分享一个工具。