【问题标题】:Using CreateWindowEx to Make a Message-Only Window使用 CreateWindowEx 创建一个仅消息窗口
【发布时间】:2011-05-04 03:20:11
【问题描述】:

我正在尝试使用CreateWindowEx 来生成仅消息窗口:

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

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

【问题讨论】:

  • 你应该可以调用 GetLastError() 来获取更多信息。
  • 有示例代码可以通过 MFC here 执行此操作。这应该隐藏一些 Win32 API 参数的复杂性。

标签: c++ windows winapi


【解决方案1】:

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 );
}

【讨论】:

  • 哦,害怕!我希望避免使用RegisterClass,因为它的文档非常模糊。你知道一个很好的例子吗?
  • 如果没有类,您将如何将窗口过程提供给系统? (我知道通过 GetWindowLong() 进行子类化)
  • @Kirill V. Lyadvinsky:current_instance 重要吗?它是如何设置的?
  • 如果不想注册窗口类,可以使用预定义的STATIC类(用于文本标签和图像框)。如果你不给它一个hWndParent 参数,它会创建一个独立的窗口!
  • 如果您不注册课程,则无法检索消息。
【解决方案2】:

根据the Microsoft docs,类名应该是“Message”。

干杯,

【讨论】:

  • 列出Message窗口类的表被描述为“下表描述了仅供系统使用的系统类。为了完整起见,它们在此处列出。”所以我认为 Windows 不希望您使用 Message 窗口类。无论如何它都是无用的,因为那时你必须子类来提供自己的窗口过程......
  • 降级以确保其他人不认为这是一个有效的答案。看上面的评论是有原因的(它是一个系统类,非系统不能使用)
猜你喜欢
  • 1970-01-01
  • 2021-03-17
  • 1970-01-01
  • 2010-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多