Win32のコーディングをSDKでする時に、メッセージクラッカーを使うと非常に便利なんで「WM_DEVICECHANGE」用の定義も「windowsx.h」あります。
↓こんなコード
/* BOOL Cls_OnDeviceChange(HWND hwnd, UINT uEvent, DWORD dwEventData) */
#define HANDLE_WM_DEVICECHANGE(hwnd, wParam, lParam, fn) \
(LRESULT)(DWORD)(BOOL)(fn)((hwnd), (UINT)(wParam), \
(DWORD)(wParam))
#define FORWARD_WM_DEVICECHANGE(hwnd, uEvent, dwEventData, fn) \
(BOOL)(DWORD)(fn)((hwnd), WM_DEVICECHANGE, (WPARAM)(UINT)(uEvent), \
(LPARAM)(DWORD)(dwEventData))
はーい、太字のところ注目!!#define HANDLE_WM_DEVICECHANGE(hwnd, wParam, lParam, fn) \
(LRESULT)(DWORD)(BOOL)(fn)((hwnd), (UINT)(wParam), \
(DWORD)(wParam))
#define FORWARD_WM_DEVICECHANGE(hwnd, uEvent, dwEventData, fn) \
(BOOL)(DWORD)(fn)((hwnd), WM_DEVICECHANGE, (WPARAM)(UINT)(uEvent), \
(LPARAM)(DWORD)(dwEventData))
はい、たぶんバグです。きっとバグです。
ここを「lParam」に修正すると意図どおりに動きました。
MS提供のソースを修正するのもなんだったので↓の用に自分のプロジェクト内でいったんundefして、再定義しました。
//バグっぽいのでいったん削除
#undef HANDLE_WM_DEVICECHANGE
#undef FORWARD_WM_DEVICECHANGE
/* BOOL Cls_OnDeviceChange(HWND hwnd, UINT uEvent, DWORD dwEventData) */
#define HANDLE_WM_DEVICECHANGE(hwnd, wParam, lParam, fn) \
(LRESULT)(DWORD)(BOOL)(fn)((hwnd), (UINT)(wParam), \
(DWORD)(lParam))
#define FORWARD_WM_DEVICECHANGE(hwnd, uEvent, dwEventData, fn) \
(BOOL)(DWORD)(fn)((hwnd), WM_DEVICECHANGE, (WPARAM)(UINT)(uEvent), \
(LPARAM)(DWORD)(dwEventData))
#undef HANDLE_WM_DEVICECHANGE
#undef FORWARD_WM_DEVICECHANGE
/* BOOL Cls_OnDeviceChange(HWND hwnd, UINT uEvent, DWORD dwEventData) */
#define HANDLE_WM_DEVICECHANGE(hwnd, wParam, lParam, fn) \
(LRESULT)(DWORD)(BOOL)(fn)((hwnd), (UINT)(wParam), \
(DWORD)(lParam))
#define FORWARD_WM_DEVICECHANGE(hwnd, uEvent, dwEventData, fn) \
(BOOL)(DWORD)(fn)((hwnd), WM_DEVICECHANGE, (WPARAM)(UINT)(uEvent), \
(LPARAM)(DWORD)(dwEventData))
コメント