Когда я запускаю свою программу (код ниже) и вставляю жесткий диск через USB-кабель, WindowProcedure
вызывается для сообщения WM_DEVICECHANGE
для события события смены устройства DBT_DEVICEARRIVAL
.GetMessage Не получать сообщения
Однако GetMessage
не возвращается. documentation for GetMessage
говорит GetMessage
Извлекает сообщение из очереди сообщений вызывающего потока.
Таким образом, похоже, что в очереди сообщений потока нет сообщений.
Почему в очереди сообщений вызывающего потока нет сообщений?
Если нет сообщений в очереди сообщений моего вызывающего потока, как/почему моя WindowProcedure
функции вызываются для WM_DEVICECHANGE
сообщения для устройства смены типа события DBT_DEVICEARRIVAL
?
Примечание: Я прочитал некоторые связанные сообщения и страницы. This stackoverflow post похоже, что это может быть связано. Если да, то как узнать, какие сообщения действительно размещаются в очереди сообщений?
namespace {
LRESULT CALLBACK WindowProcedure(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if(uMsg == WM_DEVICECHANGE)
{
switch(wParam)
{
case DBT_DEVICEARRIVAL:
{
PostQuitMessage('L');
break;
}
case DBT_DEVNODES_CHANGED:
{
break;
}
}
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
}
BOOL DoRegisterDeviceInterfaceToHwnd(IN GUID InterfaceClassGuid, IN HWND hWnd, OUT HDEVNOTIFY *hDeviceNotify)
{
DEV_BROADCAST_DEVICEINTERFACE NotificationFilter;
ZeroMemory(&NotificationFilter, sizeof(NotificationFilter));
NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
NotificationFilter.dbcc_classguid = InterfaceClassGuid;
*hDeviceNotify = RegisterDeviceNotification(
hWnd, // events recipient
&NotificationFilter, // type of device
DEVICE_NOTIFY_WINDOW_HANDLE | DEVICE_NOTIFY_ALL_INTERFACE_CLASSES // type of recipient handle
);
if (NULL == *hDeviceNotify)
{
//ErrorHandler(TEXT("RegisterDeviceNotification"));
return FALSE;
}
return TRUE;
}
int processWindowsMessages()
{
WNDCLASS windowClass = {};
windowClass.lpfnWndProc = WindowProcedure;
LPCSTR windowClassName = "DetecatAndMountMessageOnlyWindow";;
windowClass.lpszClassName = windowClassName;
if (!RegisterClass(&windowClass)) {
std::cout << "Failed to register window class" << std::endl;
return 1;
}
HWND messageWindow = CreateWindow (windowClassName, 0, 0, 0, 0, 0, 0, HWND_MESSAGE, 0, 0, 0);
//HWND messageWindow = CreateWindow (windowClassName, 0, 0, 0, 0, 0, 0, (HWND) NULL, 0, 0, 0);
if (!messageWindow) {
std::cout << "Failed to create message-only window" << std::endl;
return 1;
}
static HDEVNOTIFY hDeviceNotify;
DoRegisterDeviceInterfaceToHwnd(GUID_DEVINTERFACE_VOLUME, messageWindow, &hDeviceNotify);
MSG msg;
BOOL bRet;
std::cout << "before loop" << std::endl;
while ((bRet = GetMessage (&msg, 0, 0, 0)) != 0)
{
std::cout << "inside loop" << std::endl;
if (bRet == -1)
{
// handle the error and possibly exit
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
std::cout << msg.wParam << std::endl;
return msg.wParam;
}
int main()
{
int result = processWindowsMessages();
return 0;
}
'GetMessage' будет возвращать только сообщения, отправленные в очередь сообщений. Сообщения, которые отправляются, отправляются непосредственно в 'GetMessage', а WndProc - напрямую. –
Один ключ, который 'WM_DEVICECHANGE' не может быть опубликован, состоит в том, что' lParam' является указателем на структуру. Только отправленные сообщения могут (обычно) предоставлять указатели на память, поскольку память обычно освобождается или повторно используется отправителем после возврата вызова SendMessage. –
@JonathanPotter Итак, отправленные сообщения отправляются непосредственно в WndProc и сообщения отправляются в очередь сообщений. Однако, если я только хотел обработать отправленные сообщения, мне все равно нужно вызвать 'GetMessage', потому что это запустит процесс, по которому отправленные сообщения отправляются в WndProc. Это верно? – user3731622