int speaker(unsigned int freq,unsigned int delay)
{ static int flag=0,bit;
if(flag==0)
{
flag=1;
iopl(3);
}
outb(0xb6,0x43);
outb((freq & 0xff),0x42);
outb((freq >> 8),0x42);
bit=inb(0x61);
outb(3 | bit,0x61);
usleep(10000*delay);
outb(0xfc | bit,0x61);
}
void Stop( )
{
static int flag=0;
if(flag==0)
{
flag=1;
iopl(3);
}
outb(0xfc ,0x61);
}
#include <sys/io.h>
#include <unistd.h>
main()
{
int i;
for(i = 0; i<1; i++)
{
speaker( 2000, 40 );
sleep(2);
}
speaker( 1000, 40 );
}
//////////////////////////////////////////////////////////
用DirectSound在窗口中播放声音,可当窗口失去焦点后却不播放了,要想让它继续播放搞了一个下午也没有搞定,幸好有网络来帮助.呵呵终于搞定了.方法很简单呀,把缓冲BUFFER的dwFlags加入DSBCAPS_GLOBALFOCUS:
如何抓取扬声器的声音 :
工作中有个需求是关于抓取扬声器的声音, 为什么会有这个需求?
试想我们在共享远程桌面时,如果能够把本地桌面应用程序的声音也一起发给对方, 用户体验该是多么棒。
在考虑如何实现这个需求前,我们先讨论下电脑声音的三种模式:
1) render模式
该方式实际上就是播放(output)声音,常见的API如PlaySound, WaveOutXXX, DirectSound等
2) capture模式
该方式实际上就是录入(input)声音, 也就是我们通过麦克风输入声音,常见API如WaveInXXX
3)loopback模式
该方式就是我们需要实现的方式,即把扬声器里播放的声音抓取下来。
对于上面3种方式,render和capture方式应该比较好理解, 也都是系统有API直接支持的方式, loopback方式就比较奇怪了,在XP上该方式系统实际都没有正式支持, loopback的录制方式实际上也涉及到CD的版权问题。
////////////////////////////////////////////////////////////////////////////////////////
windows下的文件遍历(使用CFindFile)
这个我一直都很想做了,前两天开始准备,查找了一下CFindFile的资料,然后把思路理清楚,就直接开始做了。
文件系统是一个操作系统以一部分,所以想文件操作,基本上就要依赖于操作系统提供的接口函数。
在这我是直接用windows中对文件查找专门做好了的一个类来实现文件的遍历。
其实一个文件目录就是一个树,每一层目录都有很多的子目录和文件,当成节点就好了。
在使用CFindFile遍历的时候,需要先调用FindFile函数,再调用FindNextFile函数来遍历当前这一级的目录。
我为了输出方便使用了控制台工程,在这里需要提示一点:
由于windows程序设计中默认使用unicode编码,所以在使用控制台程序输出的时候,需要使用wcout来进行输出。
而使用wcout进行输出的时候,如果遇到了汉字,则会导致程序卡住,然后停止运行的情况。
解决方法是添加下面的函数调用:setlocale(LC_ALL, "chs");
void TraversFile(CString csPath)
{
CString csPrePath = csPath;
CString csNextPath = csPath;
CFileFind ff;
csPath += _T("*.*");//遍历这一级全部的目录
int nResult = ff.FindFile(csPath);
while(nResult)
{
nResult = ff.FindNextFileW();
if(ff.IsDirectory() && !ff.IsDots())
{
wcout << (LPCTSTR)ff.GetFilePath() << endl;
csNextPath += ff.GetFileName();
csNextPath += _T("\\");
TraversFile(csNextPath);
}
csNextPath = csPrePath;
}
}
这里主要采用的方法是递归调用,我觉得这种方式相对较简单,且代码段比较少可以看到,这个函数一共才20行,而且层次很清晰。
我觉得主要需要讲的就是那个if判断,因为在那块是需要注意的两个地方。
IsDirectory函数用来判断当前选中的这个文件是一个文件还是一个目录。所谓目录,其实就是文件夹啦~
如果是文件夹的话,就输出路径,然后整合文件夹的路径,传给递归调用函数,来遍历当前这个文件夹下的文件。
最开始这个这个函数的参数是某个子目录,比如我遍历的F盘,传入的参数就是:F:\\
传入这个参数之后,会在其后面添加*.*,FindFile函数在这个时候就开始查找当前目录的全部的文件和文件夹了。
基本上啊,就是一个树的深度优先遍历。
主函数的代码非常简单,但是能很好的完成功能:
using namespace std;
/*修改于20130625 做文件查找*/
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
setlocale(LC_ALL, "chs");
CString cs = _T("F:\\");
TraversFile(cs);
system("pause");
return 0;
}
//////////////////////////////////////////////////////////////////////////////////
先调用一个函数,名为:GetTopWindo。最开始传入参数为0,获取到一个句柄(应该是explorer的句柄)。然后根据这个句柄调用GetWindowThreadProcessId函数,能获取到创建这个窗口的线程ID,以及这个窗口所属的进程ID。在这里获取到线程ID后,需要做的是将此ID与当前ID进行比较。如果ID相同,就表明找到了窗口的句柄,返回即可。如果不同,那么就要继续查找,这里使用函数:GetNextWindow( h , GW_HWNDNEXT);。里面的h参数为当前的窗口句柄。此函数的返回值为下一个窗口的句柄,即HWND。不过我也是今天才明确的知道,HWND句柄和HANDLE是不一样的。
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
使用Ps API需要包含Psapi.h文件以及Psapi.lib
EmptyWorkingSet 从执行的工作集中尽可能的多删除页(page),内存优化工具就使用了这个软件。
原型:BOOL WINAPI EmptyWorkingSet( _In_ HANDLE hProcess );
EnumDeviceDrivers 枚举设备驱动
原型:BOOL WINAPI EnumDeviceDrivers( _Out_ LPVOID *lpImageBase, _In_ DWORD cb, _Out_ LPDWORD lpcbNeeded );
EnumPageFiles 枚举页文件
原型:BOOL WINAPI EnumPageFiles( _Out_ PENUM_PAGE_CALLBACK pCallbackRoutine, _In_ LPVOID lpContext );
EnumProcesses 枚举进程
原型:BOOL WINAPI EnumProcesses( _Out_ DWORD *pProcessIds, _In_ DWORD cb, _Out_ DWORD *pBytesReturned );
EnumProcessModules 枚举进程模块
原型:BOOL WINAPI EnumProcessModules( _In_ HANDLE hProcess, _Out_ HMODULE *lphModule, _In_ DWORD cb, _Out_ LPDWORD lpcbNeeded );
GetDeviceDriverBaseName 获取驱动的base name(我并不清楚base name是什么东西)
原型:DWORD WINAPI GetDeviceDriverBaseName( _In_ LPVOID ImageBase, _Out_ LPTSTR lpBaseName, _In_ DWORD nSize );
GetDeviceDriverFileName 这个是用来获取驱动的文件名
原型:DWORD WINAPI GetDeviceDriverFileName( _In_ LPVOID ImageBase, _Out_ LPTSTR lpFilename, _In_ DWORD nSize );
GetMappedFileName 这个很函数检测参数地址是不是在指定进程的地址空间的内存映射文件中,如果是,则返回内存映射文件名
原型:DWORD WINAPI GetMappedFileName( _In_ HANDLE hProcess, _In_ LPVOID lpv, _Out_ LPTSTR lpFilename, _In_ DWORD nSize );
GetModuleBaseName 获取模块的基址名称
原型:DWORD WINAPI GetModuleBaseName( _In_ HANDLE hProcess, _In_opt_ HMODULE hModule, _Out_ LPTSTR lpBaseName, _In_ DWORD nSize );
GetModuleFileNameEx 获取模块文件名
原型:DWORD WINAPI GetModuleFileNameEx( _In_ HANDLE hProcess, _In_opt_ HMODULE hModule, _Out_ LPTSTR lpFilename, _In_ DWORD nSize );
GetModuleInformation 获取模块文件信息原型:
原型:BOOL WINAPI GetModuleInformation( _In_ HANDLE hProcess, _In_ HMODULE hModule, _Out_ LPMODULEINFO lpmodinfo, _In_ DWORD cb );
GetPerformanceInfo 返回一个包含性能信息的PERFORMANCE_INFORMATION 结构体
原型:BOOL WINAPI GetPerformanceInfo( _Out_ PPERFORMANCE_INFORMATION pPerformanceInformation, _In_ DWORD cb );
GetProcessimagefilename 获取指定进程的可执行文件名
原型:DWORD WINAPI GetProcessImageFileName( _In_ HANDLE hProcess, _Out_ LPTSTR lpImageFileName, _In_ DWORD nSize );
GetProcessMemoryInfo 通过PROCESS_MEMORY_COUNTERS结构返回指定进程的内存使用信息
原型:BOOL WINAPI GetProcessMemoryInfo( _In_ HANDLE Process, _Out_ PPROCESS_MEMORY_COUNTERS ppsmemCounters, _In_ DWORD cb );
GetWsChanges 返回自 InitializeProcessForWsWatch 函数被调用后添加到工作集(WS:working set)的页(pages)信息
原型:BOOL WINAPI GetWsChanges( _In_ HANDLE hProcess, _Out_ PPSAPI_WS_WATCH_INFORMATION lpWatchInfo, _In_ DWORD cb );
API.rar_C 蜂鸣器_c# 蜂鸣器
版权申诉
28 浏览量
2022-09-23
17:19:53
上传
评论
收藏 4KB RAR 举报
局外狗
- 粉丝: 64
- 资源: 1万+
最新资源
- 上市公司-股票性质数据-工具变量(民企、国企、央企)2003-2022年.dta
- 上市公司-股票性质数据-工具变量(民企、国企、央企)2003-2022年.xlsx
- Reeds+Shepp曲线算法讲解和实现.pdf
- 毕业设计基于SpringBoot+MyBatisPlus+MySQL+Vue的外卖配送信息系统源代码+数据库
- 词向量(Word Embeddings)是自然语言处理(NLP)领域的一种重要技术.txt
- Surfer,线性函数
- MyBatis 的动态 SQL 是其核心特性之一.txt
- 时代的sdddsddsddsd
- 基于哈希链表的简单人员信息管理系统
- 其他类别JdonFramework开源框架 v5.1 Build20071025-jdonframework-5.1.rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈