【问题标题】:What is the maximum length of a window title passed to SetWindowText?传递给 SetWindowText 的窗口标题的最大长度是多少?
【发布时间】:2016-02-01 16:34:25
【问题描述】:

SetWindowText 函数的文档没有对可用作窗口标题的字符串长度进行限制。

在WM_SETTEXT(调用SetWindowText发送的消息)的文档中,注意到该消息的处理返回值可能是:

FALSE(用于编辑控件)、LB_ERRSPACE(用于列表框)或 CB_ERRSPACE(用于组合框)(如果不足)空间可用于设置编辑控件中的文本。

但是,它没有说明设置窗口标题的情况。是否设置了严格的限制,还是由程序员使用常识来提供自己的标题长度限制?


我发布这个是因为我正在开发一个图形引擎,它允许用户为主窗口提供他们自己的标题。这个想法是我会定义一个常量,例如

const static int MAX_APP_TITLE_LENGTH = /* ??? */;

在我的应用程序类中,检查用户提供的标题字符串的长度。

如果标题字符串太长,我可以抛出警告消息并截断它,而不是直接将其传递给 SetWindowText 并产生意想不到的后果。


编辑:在cmets中经过一番讨论,似乎windows即使使用长度为100,000的字符串作为窗口标题也不会报错,所以这个问题不值得担心(超出当然是对输入的基本清理)!

【问题讨论】:

  • 这个问题的动机是什么?
  • 我不认为操作系统施加了限制。你可以设置任何你想要的长度。相同的 API 用于设置控件中的文本,例如 Edit 控件,它可以存储大量文本(可能是 64k?为什么听起来正确?)。如果您想确定要分配的缓冲区大小,可以使用WM_GETTEXTLENGTH 消息来检索长度。
  • 刚刚尝试使用 100'000 字符字符串。有用。应该够了。
  • 我认为你在考虑这个问题。只需让用户提供他们想要的名称即可。如果他们提供的名称太长,他们无论如何都看不到它。早在系统抱怨之前,屏幕的像素就会耗尽。
  • 你打算无缘无故地破坏Zero one infinity rule。让用户传递一个std::wstring,不要强加任意限制。如果发送WM_SETTEXT 失败,则抛出异常。

标签: winapi


【解决方案1】:

从技术上讲,标题大小没有限制,但 lpClassName 字段有 256 个字符的严格限制(我不想让你认为你可能有一个无限的类名并且你的代码会崩溃。)

来源:https://docs.microsoft.com/en-us/windows/win32/api/winuser/ns-winuser-wndclassexw

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 2010-11-20
    • 1970-01-01
    相关资源
    最近更新 更多