WM_DEVICECHANGE

Тема в разделе "WASM.WIN32", создана пользователем RamMerLabs, 25 дек 2006.

  1. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    в msdn написано,что любое изменение конфигурации железа (даже извлечение диска из сидюка) вызывает отправление сообщения WM_DEVICECHANGE всем программам. но моя почему-то не получает. Помогите разобраться, плз!

    MSDN:
    Код (Text):
    1. #include <windows.h>
    2. #include <dbt.h>
    3.  
    4. void Main_OnDeviceChange (HWND hwnd, WPARAM wParam, LPARAM lParam);
    5. char FirstDriveFromMask (ULONG unitmask);  //prototype
    6.  
    7. /*------------------------------------------------------------------
    8.    Main_OnDeviceChange (hwnd, wParam, lParam)
    9.  
    10.    Description
    11.       Handles WM_DEVICECHANGE messages sent to the application's
    12.       top-level window.
    13. --------------------------------------------------------------------*/
    14.  
    15. void Main_OnDeviceChange (HWND hwnd, WPARAM wParam, LPARAM lParam)
    16. {
    17.    PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)lParam;
    18.    char szMsg[80];
    19.  
    20.    switch(wParam)
    21.    {
    22.       case DBT_DEVICEARRIVAL:
    23.          // Check whether a CD or DVD was inserted into a drive.
    24.          if (lpdb -> dbch_devicetype == DBT_DEVTYP_VOLUME)
    25.          {
    26.             PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
    27.  
    28.             if (lpdbv -> dbcv_flags & DBTF_MEDIA)
    29.             {
    30.                wsprintf (szMsg, "Drive %c: Media has arrived.\n",
    31.                          FirstDriveFromMask(lpdbv ->dbcv_unitmask));
    32.  
    33.                MessageBox (hwnd, szMsg, "WM_DEVICECHANGE", MB_OK);
    34.             }
    35.          }
    36.          break;
    37.  
    38.       case DBT_DEVICEREMOVECOMPLETE:
    39.          // Check whether a CD or DVD was removed from a drive.
    40.          if (lpdb -> dbch_devicetype == DBT_DEVTYP_VOLUME)
    41.          {
    42.             PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
    43.  
    44.             if (lpdbv -> dbcv_flags & DBTF_MEDIA)
    45.             {
    46.                wsprintf (szMsg, "Drive %c: Media was removed.\n",
    47.                          FirstDriveFromMask(lpdbv ->dbcv_unitmask));
    48.  
    49.                MessageBox (hwnd, szMsg, "WM_DEVICECHANGE", MB_OK);
    50.             }
    51.          }
    52.          break;
    53.  
    54.       default:
    55.            /*
    56.               Process other WM_DEVICECHANGE notifications for other
    57.               devices or reasons.
    58.            */
    59.             ;
    60.    }
    61. }
    62.  
    63. /*------------------------------------------------------------------
    64.    FirstDriveFromMask (unitmask)
    65.  
    66.    Description
    67.      Finds the first valid drive letter from a mask of drive letters.
    68.      The mask must be in the format bit 0 = A, bit 1 = B, bit 3 = C,
    69.      etc. A valid drive letter is defined when the corresponding bit
    70.      is set to 1.
    71.  
    72.    Returns the first drive letter that was found.
    73. --------------------------------------------------------------------*/
    74.  
    75. char FirstDriveFromMask (ULONG unitmask)
    76. {
    77.    char i;
    78.  
    79.    for (i = 0; i < 26; ++i)
    80.    {
    81.       if (unitmask & 0x1)
    82.          break;
    83.       unitmask = unitmask >> 1;
    84.    }
    85.  
    86.    return (i + 'A');
    87. }
     
  2. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Не всем программам, а только top-level окнам. У тебя окна, наверное, нету. Если код скопипастен отсюда http://support.microsoft.com/kb/163503, то он рабочий и проблема не в нем.
     
  3. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    Окно как раз есть - а код всё равно не работает (всё на vс++)
     
  4. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Всё равно проблема не в приведённом куске кода, ибо код http://support.microsoft.com/kb/163503, рабочий 100%. Окно должно быть самого верхнего уровня (GetParent должна вернуть NULL). Если уверен, что окно top-level, то может быть какие-нибудь системные настройки, хотя сомневаюсь, что это можно отключить. Эксплорер, небось, свои окна рефрешит именно таким образом.