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

时间:2016-05-23 05:26:23

标签: c winapi

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

例如;

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

来自msdn documentation; nIndex参数应为:

  

要设置的值的从零开始的偏移量。有效值在零范围内,通过额外窗口内存的字节数减去整数的大小。

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

1 个答案:

答案 0 :(得分:1)

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

例如,如果我说

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子类化例程提供了一种方法,您可以将一个指针大小的整数与子类一起存储,这有助于。)

在必要时将“指针”替换为“指针大小的整数”。