1个回答
展开全部
如果是单纯判断声音,那么如果用户还在播放其他音频呢?
你可以尝试获取播放器的前台程序句柄,然后再寻找子控件,找到对应的播放/暂停键判断。
需要使用API,API声明如下:
.版本 2
.DLL命令 取窗口标题_, 整数型, "user32", "GetWindowTextA", , , 取得一个窗体的标题(caption)文字,或者一个控件的内容(在vb里使用:使用vb窗体或控件的caption或text属性) 复制到lpString的字串长度;不包括空中止字符。会设置GetLastError
.参数 窗口句柄, 整数型, , 欲获取文字的那个窗口的句柄
.参数 缓冲区, 文本型, , 预定义的一个缓冲区,至少有cch+1个字符大小;随同窗口文字载入
.参数 缓冲尺寸, 整数型, , lp缓冲区的长度;
.DLL命令 GetWindowThreadProcessId, 整数型, "user32"
.参数 hwnd, 整数型
.参数 lpdwProcessId, 整数型, 传址
.DLL命令 寻找子窗口_, 整数型, "user32", "FindWindowExA", , , 在窗口列表中寻找与指定条件相符的第一个子窗口 找到的窗口的句柄。如未找到相符窗口,则返回零。会设置GetLastError
.参数 窗口句柄1, 整数型, , 在其中查找子的父窗口。如设为零,表示使用桌面窗口(通常说的顶级窗口都被认为是桌面的子窗口,所以也会对它们进行查找)
.参数 窗口句柄2, 整数型, , 从这个窗口后开始查找。这样便可利用对FindWindowEx的多次调用找到符合条件的所有子窗口。如设为零,表示从第一个子窗口开始搜索
.参数 欲搜索的类名1, 文本型, , 欲搜索的类名。“”表示忽略
.参数 欲搜索的类名2, 文本型, , 欲搜索的类名。“”表示忽略;
.DLL命令 发送消息_, 整数型, "user32", "SendMessageA", , , 调用一个窗口的窗口函数,将一条消息发给那个窗口。除非消息处理完毕,否则该函数不会返回。SendMessageBynum, ; SendMessageByString是该函数的“类型安全”声明形式 由具体的消息决定
.参数 窗口句柄, 整数型, , 要接收消息的那个窗口的句柄
.参数 信息值, 整数型, , 消息的标识符
.参数 参数一, 逻辑型, , 具体取决于消息
.参数 参数二, 整数型, , 具体取决于消息;
在程序集中,调用命令如下:
.版本 2
.子程序 API_取组件句柄, 整数型
.参数 父窗口句柄, 整数型
.参数 开始寻找的组件句柄, 整数型, 可空, 如果指定则从该组件开始寻找,为空或为0则从开始寻找。
.参数 欲寻找的组件窗口类名, 文本型, 可空, 欲寻找的组件的窗口类名,为空则寻找所有类型的组件。
.参数 欲寻找的组件文本, 文本型, 可空, 欲寻找的组件的标题、内容等属性,为空则寻找所有组件。
返回 (寻找子窗口_ (父窗口句柄, 开始寻找的组件句柄, 欲寻找的组件窗口类名, 欲寻找的组件文本))
.子程序 API_取窗口标题, 整数型
.参数 句柄, 整数型, , 可以是窗口的,也可以是组件的。
.参数 保存标题的文本变量, 文本型, 参考
.参数 缓冲区长度, 整数型, 可空, 欲保存的结果长度,若取得的结果长度大于本参数则去除多余的文本。为空则默认为255。
.如果真 (是否为空 (缓冲区长度))
缓冲区长度 = 255
.如果真结束
保存标题的文本变量 = 取空白文本 (缓冲区长度)
返回 (取窗口标题_ (句柄, 保存标题的文本变量, 缓冲区长度))
.版本 2
.支持库 eAPI
.子程序 进程取句柄, 整数型, , 区分大小写
.参数 进程名, 文本型
.局部变量 所有句柄, 文本型, , "0"
.局部变量 计次1, 整数型
.局部变量 进程ID, 整数型
.局部变量 所有进程, 进程信息, , "0"
.局部变量 计次2, 整数型
.局部变量 指定进程ID, 整数型
.局部变量 保存, 文本型
所有句柄 = 取所有窗口列表 ()
所有进程 = 取系统进程列表 ()
.计次循环首 (取数组成员数 (所有进程), 计次2)
.如果真 (所有进程 [计次2].进程名称 = 进程名)
指定进程ID = 所有进程 [计次2].进程标识符
跳出循环 ()
.如果真结束
.计次循环尾 ()
.计次循环首 (取数组成员数 (所有句柄), 计次1)
GetWindowThreadProcessId (到数值 (所有句柄 [计次1]), 进程ID)
保存 = “”
.如果真 (进程ID = 指定进程ID)
保存 = 所有句柄 [计次1]
跳出循环 ()
.如果真结束
.计次循环尾 ()
返回 (到整数 (保存))
调用实例如下:
.版本 2
.支持库 eAPI
.支持库 spec
寻找的标题 = “Win32.Rbot专用查杀工具”
窗口列表 = 取所有窗口列表 ()
.计次循环首 (取数组成员数 (窗口列表), Temp)
.如果真 (取窗口标题 (到整数 (窗口列表 [Temp])) = 寻找的标题)
程序句柄 = 到整数 (窗口列表 [Temp])
.如果真结束
.计次循环尾 ()
按钮句柄 = 取组件句柄 (程序句柄, 0, “Button”, “杀毒”)
.判断循环首 (按钮句柄 ≠ 0)
API_取窗口标题 (按钮句柄, 缓冲区, )
.如果真 (缓冲区 = “杀毒”)
跳出循环 ()
.如果真结束
按钮句柄 = 取组件句柄 (程序句柄, , “Button”, “杀毒”)
.判断循环尾 ()
API_取窗口标题 (按钮句柄, 缓冲区)
.如果真 (缓冲区 = “杀毒”)
发送消息_ (按钮句柄, 245, 真, 0)
这样的效果就是,在所有前台进程中遍历寻找一个窗口标题是“Win32.Rbot专用查杀工具
”的应用程序的窗口,获取其句柄,然后在这个窗口中寻找类名为“Button”、标题为“杀毒”的子控件。如果是,则单击之。
以上实例代码稍加修改即符合你的要求。
如有疑问请追问。
追问
我判断的是网页里播放器的声音
追答
网页播放器就没有办法了,可以试一试抓取flash状态来实现。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询