使用CreateWindowEx创建一个仅用于消息的窗口

26

我正在尝试使用CreateWindowEx来创建一个仅用于消息处理的窗口:

_hWnd = CreateWindowEx( 0, NULL, NULL, 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, NULL, NULL );

当我的应用程序执行这行代码时,它总是返回 _hWnd = 0。我做错了什么?


你应该能够调用GetLastError()函数来获取更多信息。 - user245019
1
这里有一个使用MFC的示例代码链接,可以隐藏一些Win32 API参数复杂性。 - Steve Townsend
2个回答

54

lpClassName不应该为NULL。使用RegisterClassEx函数注册类并将其传递给CreateWindowEx

static const char* class_name = "DUMMY_CLASS";
WNDCLASSEX wx = {};
wx.cbSize = sizeof(WNDCLASSEX);
wx.lpfnWndProc = pWndProc;        // function which will handle messages
wx.hInstance = current_instance;
wx.lpszClassName = class_name;
if ( RegisterClassEx(&wx) ) {
  CreateWindowEx( 0, class_name, "dummy_name", 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, NULL, NULL );
}

1
哦,糟糕!我希望避免使用RegisterClass,因为它的文档非常模糊。你知道有好的例子吗? - Jim Fell
1
没有类,你还能用什么方式将窗口过程提供给系统呢?(我知道可以通过 GetWindowLong() 进行子类化) - Seva Alekseyev
3
current_instance很重要吗?它是如何设置的? - Jim Fell
6
如果您不想注册窗口类,可以使用预定义的STATIC类(用于文本标签和图像框)。如果没有给它一个hWndParent参数,它将创建一个独立的窗口! - André Caron
2
如果您不注册一个类,就无法检索消息。 - AnArrayOfFunctions
显示剩余3条评论

-9

14
“下表描述了仅供系统使用的系统类。它们在此列出以保证完整性。”因此,我认为Windows不希望您使用“Message”窗口类。无论如何,它也是无用的,因为您将不得不子类化以提供自己的窗口过程... - Adam Badura
降级以确保其他人不认为这是一个有效的答案。请参见上面的注释(它是一个仅限系统使用的类,不能被非系统使用)。 - YePhIcK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接