用sdk编程的时候, 在一个对话框里面放一个listview,
设置成report模式, 并且添加了几个item
最后,dialogbox出来后, 发现选择其中的item
系统会发出万恶的“叮”的声音, MessageBeep(1)的声音,
但是, 用MFC做的程序, 里面的listview是不会发出这种奇怪的声音的,
包括系统的listview, 比如目录里面文件详细列表, 桌面等,
怎么选都不会有这种古怪的声音,
我现在的解决方法就是吧声音关了, 我被这个声音快折磨死了。google,baidu了N久, 也查了MSDN,跟踪了MFC的代码,
找不到对策, 谁来帮帮我?

解决方案 »

  1.   

    经过晚上调试发现是是comctl32的一个bug, 具体表现在:
    comctl32.dll!_CCPlaySound@4 这个函数里面, 伪代码描述如下
    comctl32.dll file version 5.82(vista_rtm.061101-2205)char buf[280];
    DWORD retsize = 280;if (ERROR_SUCCESS == RegQueryValue(HKEY_CURRENT_USER, "AppEvents\Schemes\Apps\.Default\CCSelect\.current", buf, &retsize))
    {
       LoadLibrary("wimm.dll");
       GetProcAddress("waveOutGetNumDevs");
       GetProcAddress("PlaySoundW");
       call function waveOutGetNumDevs;
       call function PlaySoundW(buf, 0, 1);
    }当电脑上存在AppEvents\Schemes\Apps\.Default\CCSelect\.current键值的时候,
    并且默认值被删除的情况下, RegQueryValue会返回ERROR_SUCCESS, 并且retsize=0, 
    buf的内容不做改变。
    这时如果buf的内容无效调用PlaySound则会导致一个错误, 于是系统给予ding.wav的声音。
    当如果恰巧buf本身就是0,0开头的unicode串, 那么则不会有任何反应。 MFC的程序恰巧碰到这一点。也就是说上面的条件需要改成
    if (ERROR_SUCCESS == RegQueryValue(HKEY_CURRENT_USER, "AppEvents\Schemes\Apps\.Default\CCSelect\.current", buf, &retsize)
        && retsize != 0)不知道怎么会反馈给微软,
    该问题2天后结贴
      

  2.   

    没有这么做过,都用的MFC的CListctrl  ,学习
      

  3.   

    谢谢楼主……我用的是 VB,为了实现主题效果必须用 Common Controls 5.0(即 comctl32 啦),每个用到 ListView 的 Style=lvwReport 时都出现了这个问题。
    不过要用 SendMessage(ListView.hWnd, LVM_SETEXTENDEDLISTVIEWSTYLE, GetWindowLong(ListView.hWnd, GWL_EXSTYLE) Or LVS_EX_FULLROWSELECT) 将 ListView 设置为整行选中时才会有这个问题。如果是普通样式也不会有“叮”声。
    至于 Common Controls 6.0 则没有任何问题,不过不接受 InitCommonControls。