如何在64位版本的Windows中调用SetWindowLong()?

hkB*_*sai 16 c++ 64-bit winapi setwindowlong

在头文件中WinUser.h,有一个部分SetWindowLong()定义了第二个参数的常量.

// ...

#define GWL_WNDPROC         (-4)
#define GWL_HINSTANCE       (-6)
#define GWL_HWNDPARENT      (-8)
#define GWL_STYLE           (-16)
#define GWL_EXSTYLE         (-20)
#define GWL_USERDATA        (-21)
#define GWL_ID              (-12)

#ifdef _WIN64

#undef GWL_WNDPROC
#undef GWL_HINSTANCE
#undef GWL_HWNDPARENT
#undef GWL_USERDATA

#endif /* _WIN64 */

#define GWLP_WNDPROC        (-4)
#define GWLP_HINSTANCE      (-6)
#define GWLP_HWNDPARENT     (-8)
#define GWLP_USERDATA       (-21)
#define GWLP_ID             (-12)

// ...
Run Code Online (Sandbox Code Playgroud)

但是,如果_WIN64定义了未定义,它们就是正确的; 它在我的64位系统中定义.

如您所见,还有一GWLP_***组常量,但它们未在页面中记录SetWindowLong().

为什么这些常量在x64系统中未定义?在x64系统
中调用的替代方法是SetWindowLong()什么?


我的系统:
操作系统:Windows 7 Ultimate x64 SP1
IDE:Visual Studio 2012 Ultimate Update 3

Jon*_*ter 36

某些窗口数据值(例如,指向"指针大小"对象的值,例如窗口过程)需要在x64构建中为64位.旧版SetWindowLong()GetWindowLong()函数仅限于DWORD大小(32位)值以实现向后兼容性,Microsoft已推出新版本,SetWindowLongPtr()GetWindowLongPtr()允许您使用指针大小的值(32位构建中的32位,64位中的64位)位构建).

这些天建议你总是使用SetWindowLongPtr()GWLP_xxx常量,无论你是构建32位还是64位,但是在64位构建中你需要使用新函数,所以定义是#undefined导致构建错误迫使你修复你的代码.

  • 我遇到了这个问题,这个答案帮助了我。谢谢! (2认同)