c - 将数据存储在自定义索引: GWLP_USERDATA_EX?中

标签 c winapi

如何使用 SetWindowLongPtr(_In_ HWND hWnd, _In_ int nIndex, _In_ LONG_PTR dwNewLong) 将数据存储在自定义索引中?

例如;

SetWindowLongPtr(hwnd, GWLP_USERDATA_CUSTOM, (LONG_PTR)dispatcher);

来自msdn documentation ; nIndex 参数应该是:

The zero-based offset to the value to be set. Valid values are in the range zero through the number of bytes of extra window memory, minus the size of an integer.

不太明白这是什么意思?如何确定可用的额外窗口内存字节数?本质上,我已经在使用 GWLP_USERDATA 来存储指针,因此空间不足。如果我可以将信息存储在另一个索引中,那将非常有用。

最佳答案

通过 WNDCLASS 结构的 cbWndExtra 成员注册窗口类时,您可以决定可用的额外窗口字节数。

例如,如果我说

wc.cbWndExtra = sizeof (LONG) + sizeof (void *);

然后我可以将 LONGvoid * 填充到我的窗口中

SetWindowLongW(hwnd, 0, myLONGValue);
SetWindowLongPtrW(hwnd, sizeof (LONG), (LONG_PTR) myPointerValue);

(为了安全起见,我总是以指针大小整数的倍数存储值,并专门使用 SetWindowLongPtrW()。)

您在对话框中使用的各种 DWLP_xxx 常量也以这种方式工作。

请注意,这意味着您自己注册了窗口类;也就是说,您是调用 RegisterClass()RegisterClassEx() 的人。如果您没有这样做,那么您根本没有权限访问索引 0 之外的内存(除非窗口类的作者允许您这样做,就像对话框和 DWLP_xxx 的情况一样)。如果您有一个现有的窗口句柄并且需要将一些与该窗口相关的数据填充到某处,那么您就得靠自己了。 (如果您要对窗口进行子类化,则 Common Controls 6 子类化例程为您提供了一种将一个指针大小的整数与子类一起存储的方法,这很有帮助。)

必要时用“指针”替换“指针大小的整数”。

关于c - 将数据存储在自定义索引: GWLP_USERDATA_EX?中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37383162/

相关文章:

c++ - c中#define的理解

c++ - 即使缓冲区被未决操作覆盖,WriteFile 也成功

c++ - 如何在 C++ win32 API 中使用 pwdlastset 值和 maxpwdage 值获取 pwdexpirydate?

C# 或 C/C++ 如何从客户端接收数据包,过滤并将它们重定向到服务器,从服务器接收并发送给客户端

c++ - my_string(char* s) 是什么意思?

c - 枚举范围

c++ - 如何在 win32 中获取 HWND?

c++ - 正在运行的线程中的 cstatic 控件的 Redrawwindow

winapi - 调用返回 ERROR_MORE_DATA 或 ERROR_INSUFFICIENT_BUFFER 的 Win32 API 函数的模式?

无法链接 OpenSSL 代码