软件开发
开发分享
软件下载

VB/C# WebBrowser控件去除网页声音的完美解决方案

时间:2010-07-14 来源:juhe99 点击量:

VB/C# WebBrowser控件去除网页声音的完美解决方案

程序功能:

屏蔽当前程序的所有声音,比如:控件WebBrowser在打开页面的时候可能有背景音乐、Flash动画等所有组件发出的声音,但不影响程序外任何一种可以播放声音的软件;作用范围仅仅局限于当前进程~

核心实现原理

通过Hook系统音频API函数,修改相关函数的执行逻辑,使其直接返回而不实际播放声音。

Delphi DLL实现代码

library DSounds;

uses
  Windows,
  SysUtils,
  Classes;

function DSoundsCode():Integer ;stdcall;
var
  hDSound: Cardinal;
  pDirectSoundCreate: Pointer;
  hWinmm: Cardinal;
  pmidiStreamOpen: Pointer;
  pwaveOutWrite: Pointer;
  lp: Cardinal;
begin
  // Hook DirectSound
  hDSound := LoadLibrary('DSound.dll');
  if hDSound > 0 then
    pDirectSoundCreate := GetProcAddress(hDSound, 'DirectSoundCreate');
  if pDirectSoundCreate <> nil then
  begin
    VirtualProtect(pDirectSoundCreate, 3, PAGE_EXECUTE_READWRITE, lp);
    Move(#$C2#$0C#$00, pDirectSoundCreate^, 3); // 修改函数直接返回
  end;

  // Hook MIDI
  hWinmm := LoadLibrary('Winmm.dll');
  if hWinmm > 0 then
    pmidiStreamOpen := GetProcAddress(hWinmm, 'midiStreamOpen');
  if pmidiStreamOpen <> nil then
  begin
    VirtualProtect(pmidiStreamOpen, 3, PAGE_EXECUTE_READWRITE, lp);
    Move(#$C2#$04#$00, pmidiStreamOpen^, 3); // 修改函数直接返回
  end;

  // Hook Wave
  if hWinmm > 0 then
    pwaveOutWrite := GetProcAddress(hWinmm, 'waveOutWrite');
  if pwaveOutWrite <> nil then
  begin
    VirtualProtect(pwaveOutWrite, 3, PAGE_EXECUTE_READWRITE, lp);
    Move(#$C2#$0C#$00, pwaveOutWrite^, 3); // 修改函数直接返回
  end;
  
  Result := 1597;
end;

exports DSoundsCode;
begin
end.

C#调用代码

////// 调用外部DLL DELPHI
///public class AnyCall
{
    private const string _fileDll = @"DSounds";
    [DllImport(_fileDll, EntryPoint = "DSoundsCode", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
    public static extern int DSoundsCode();

    public int CallDSoundsCode()
    {
        return DSoundsCode();
    }
}

使用方法

  1. 部署DLL:将DSounds.dll放到应用程序的bin\Debug目录

  2. 创建调用类:在项目中新建一个类,比如AnyCall,并把上面的代码复制到类里面

  3. 程序初始化调用:在程序开始的地方调用AnyCall方法,比如:new JavaScript.AnyCall().CallDSoundsCode();

  4. 测试效果:按下F6看看效果如何

提示:其实直接将它改成类就行了,没必要调用dll,改一下就能换成VB了,呵呵。

技术说明

  • 作用范围:仅影响当前进程,不会影响系统其他应用程序

  • 实现原理:通过修改关键音频API函数的机器码,使其直接返回而不执行实际的音频播放操作

  • 兼容性:适用于WebBrowser控件加载的各种音频内容,包括Flash、HTML5音频等

  • 安全性:该方法通过API Hook实现,不会对系统造成永久性修改