问题:屏蔽WebBrowser页面中传出来的声音。条件:不能屏蔽其它程序中的声音,因为我想听音乐(通过IE或本地软件)分不多,请高手们不吝赐教。^_^

解决方案 »

  1.   

    不知道你指的聲音是哪類如果是播放器的歌聲音可以試下這個
    wb.OleObject.document.all.tags('object').item(0).controls.stop;如果你是用 TEmbeddedWB它可以直接屏蔽 JS 圖片 背景音樂 框架 activex 等等很多東西
    wb.DownloadOptions := [DontExecuteScripts,DontDownloadFrame,DownloadAndIgnoreCache];
      

  2.   

    1,声音有可能是页面中发的歌,也有可能是广告的声音。  wb.OleObject.document.all.tags('object').item(0).controls.stop; 这样做能屏蔽页面框架中的声音??
      
    2,不知道您说的TEmbeddedWB是什么。见笑了。我是想在窗体上放一个CheckBox,选中了就没声音了,不选就有声音,呵呵能不能通过拦截消息的方式处理这个问题?怎么处理? 谢谢。
      

  3.   

    IE的工具菜单中的“Internet选项”功能中,有“高级”一栏,里面有多媒体:播放网页中的声音,将这个功能选项的前面的勾去掉,网页就不会播放声音了。而其他软件不会受到影响
      

  4.   


    你若通过编程来控制的话,要修改注册表:
    其键为HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\AdvancedOptions\MULTIMEDIA\SOUNDS
    子键为CheckedValue,默认值为yes,要将其改为no
      

  5.   


    WebBrowser不就是个IE吗?楼主说话自相矛盾!
      

  6.   

    “你若通过编程来控制的话,要修改注册表:
    其键为HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\AdvancedOptions\MULTIMEDIA\SOUNDS
    子键为CheckedValue,默认值为yes,要将其改为no”我想您误会了我的意思了。我只是想屏蔽用我程序中的WebBrowser打开的页面中的声音,并不是要屏蔽所有IE中的声音。我的意思是我在我的程序中打开了一个网页,网页中有播放的声音,但是我不想听,所以要屏蔽掉。同时我还想用IE打开网站听歌。
      

  7.   

    楼主试着去捞水中的月亮,能捞得着吗?因为WebBrowser和IE就是同一个东西。你也太雷人了吧
      

  8.   

    WebBrowser和IE是同一个东东,这个您不说大家也知道。但是我想我问的问题应该不是不可能解决的问题。您说这样的话也挺雷人的。希望高手们不吝赐教谢谢。
      

  9.   


    您说的对,WebBrowser和IE确实是一样的。但我说的话也不是自相矛盾。
    我不是想要所有的网页都没有声音,我只是要想控制从我程序窗体上的WebBrowser中打开的网页的声音开关,这样说您明白了吧??
      

  10.   

    procedure TForm1.FormCreate(Sender: TObject);
    var
      hDSound: Cardinal;
      pDirectSoundCreate: Pointer;
      hWinmm: Cardinal;
      pmidiStreamOpen: Pointer;
      lp: Cardinal;
    begin
      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;  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;
    end;
      

  11.   

    大概沒有什麼解決不了的。只是看有沒有找到正確的方法如果你程序不是相當於瀏覽器一類的東西,那完全可以用它 TEmbeddedWB 將JS,框架(沒JS沒框架,不執行ACtivex,自然不會播放MP3,也不會下載FALSE,背景音樂) 
    以及指定框架網址屏蔽掉,功能比自帶的webbrowser 要強多了
    http://www.bsalsa.com/downloads.html
      

  12.   


    我试了您的方法,它只对程序播放的声音有用。如TMediaPlayer播放的声音。但是对WebBrowser中发出来的声音不用作用。
      

  13.   

    页面。
    就比如说下面这个博客吧
    http://blog.sina.com.cn/u/1196084612
      

  14.   

    procedure TForm1.FormCreate(Sender: TObject);
    var
      hDSound: Cardinal;
      pDirectSoundCreate: Pointer;
      hWinmm: Cardinal;
      pmidiStreamOpen: Pointer;
      pwaveOutWrite: Pointer;
      lp: Cardinal;
    begin
      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;  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;  if hWinmm > 0 then
        pwaveOutWrite := GetProcAddress(hWinmm, 'waveOutWrite');
      if pwaveOutWrite <> nil then
      begin
        VirtualProtect(pwaveOutWrite, 3, PAGE_EXECUTE_READWRITE, lp);
        Move(#$C2#$18#$00, pwaveOutWrite^, 3);
      end;
    end;
      

  15.   

    搞错了个参数。用这个procedure TForm1.FormCreate(Sender: TObject);
    var
      hDSound: Cardinal;
      pDirectSoundCreate: Pointer;
      hWinmm: Cardinal;
      pmidiStreamOpen: Pointer;
      pwaveOutWrite: Pointer;
      lp: Cardinal;
    begin
      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;  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;  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;
    end;
      

  16.   

    pathletboy,我终于发现了,你就是传说中的高手。你的方法的确可以达到我的目的,我把原的来函数地址保存下来还可以随时恢愎(恢愎完要刷新网页)。真是太好了,十分感谢你。另外:1,Move(#$C2#$0C#$00, pDirectSoundCreate^, 3);//这句里的#$C2#$0C#$00参数有没有什么讲究,难道不怕正好是另一个函数的地址吗?
       2,我给您网页之后您就找到了waveOutWrite这个函数,请问您是用什么工具找的,谢谢!
      

  17.   

    1、是机器码,对应汇编语言是retn 0c。
    2、可通过反汇编工具,如windbg或者ollydbg找出。
      

  18.   

    楼上的是属于挂接API 了 只不过是没有转发 而已。
       有是一种方法啊