Message-Only的作用是什么?
根据MSDN的回答,
只有消息窗口允许您发送和接收消息。它不可见,没有z顺序,无法枚举,并且不接收广播消息。窗口只是发送消息。
要创建仅消息窗口,请在CreateWindowEx函数的hWndParent参数中指定HWND_MESSAGE常量或现有仅消息窗口的句柄。您还可以通过在SetParent函数的hWndNewParent参数中指定HWND_MESSAGE,将现有窗口更改为只显示消息的窗口。
要仅查找消息窗口,请在FindWindowEx函数的HwndParent参数中指定HWND_MESSAGE。此外,如果HwndParent和HwndChildAfter参数均为空,则FindWindowEx只搜索消息窗口以及顶级窗口。
一个简单的样本展示,可以直接拷到VS里面编译
#include <windows.h>
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_CREATE:
// MessageBox(NULL, "WM_CREATE", "Message", 0);
break;
case WM_DEVICECHANGE:
MessageBox(NULL, "WM_DEVICECHANGE", "Message", 0);//USB设备插拔提示
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
int main()
{
static const char* class_name = "NAME_CLASS";
WNDCLASSEX wx = {};
HWND hwnd;
HINSTANCE hInstance = GetModuleHandleA(NULL);
wx.cbSize = sizeof(WNDCLASSEX);
wx.lpfnWndProc = WndProc; // function which will handle messages
wx.hInstance = hInstance;
wx.lpszClassName = class_name;
if (RegisterClassEx(&wx)) {
hwnd = CreateWindowEx(0, class_name, "Title", 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, NULL, NULL);
// Create a normal top-level window which can receive the broadcast messages.
}
HACCEL hAccelTable = LoadAccelerators(hInstance, class_name);
MSG msg;
while (GetMessage(&msg, nullptr, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int)msg.wParam;
}