如何使用SetWindowLongPtr(_In_ HWND hWnd, _In_ int nIndex, _In_ LONG_PTR dwNewLong)
将数据存储在自定义索引中?
例如;
SetWindowLongPtr(hwnd, GWLP_USERDATA_CUSTOM, (LONG_PTR)dispatcher);
来自msdn documentation; nIndex
参数应为:
要设置的值的从零开始的偏移量。有效值在零范围内,通过额外窗口内存的字节数减去整数的大小。
我不太明白这意味着什么?如何确定可用的额外窗口内存字节数?基本上,我已经使用GWLP_USERDATA
来存储指针,所以我已经没空了。如果我可以将信息存储在另一个索引中,那将非常有用。
答案 0 :(得分:1)
通过cbWndExtra
结构的WNDCLASS
成员注册窗口类时,可以确定可用的额外窗口字节数。
例如,如果我说
wc.cbWndExtra = sizeof (LONG) + sizeof (void *);
然后我可以使用
将LONG
和void *
填入我的窗口
SetWindowLongW(hwnd, 0, myLONGValue);
SetWindowLongPtrW(hwnd, sizeof (LONG), (LONG_PTR) myPointerValue);
(为了安全起见,我总是将值存储为指针大小的整数倍,并且只使用SetWindowLongPtrW()
。)
您在对话框中使用的各种DWLP_xxx
常量也可以这样工作。
请注意,这意味着您自己注册了窗口类;也就是说,您是致电RegisterClass()
或RegisterClassEx()
的人。如果你没有,那么你根本没有权限访问索引0之外的内存(除非窗口类的作者允许你,就像对话框和DWLP_xxx
那样)。如果你有一个现有的窗口句柄,并且需要在某个地方填充与该窗口相关的一些数据,那么你就可以自己动手了。 (如果您是子类化窗口,Common Controls 6子类化例程提供了一种方法,您可以将一个指针大小的整数与子类一起存储,这有助于。)
在必要时将“指针”替换为“指针大小的整数”。