据我所知MSDN documentation on Windows Data Types,HWND
相当于void*
:
HWND - 窗口的句柄。此类型在WinDef.h中声明如下:typedef HANDLE HWND; HANDLE - 对象的句柄。此类型在WinNT.h中声明如下:typedef PVOID HANDLE; PVOID - 指向任何类型的指针。此类型在WinNT.h中声明如下:typedef void * PVOID;
但是,如果我尝试以下方法:
int foo;
HWND bar = &foo;
我的编译器(VS2012)抱怨:
error C2440: '=' : cannot convert from 'int *' to 'HWND'
Types pointed to are unrelated; conversion requires reinterpret_cast,
C-style cast or function-style cast
我无法弄清楚原因。我已经确定它与typedef的使用无关,因为以下编译很好:
typedef void* MyType;
int foo;
MyType bar = &foo;
是什么阻止我将任意对象的地址分配给HWND
?
我想这样做的原因是,如果有人反对我试图在第一时间做这件事,那就是我有一些涉及HWND
的代码,我希望通过提供{ {1}}具有我可以测试的已知值。
答案 0 :(得分:8)
如果在编译期间定义了STRICT
,则HWND
被定义为指向虚拟结构而不是void*
的指针。
添加STRICT
的原因之一是使编译器能够捕获您想要执行的隐式转换(许多人确实没有这样做)。由于您确实需要“松散检查”,因此请确保未定义STRICT
。
或者只是演员。
(请注意,yic81在您链接的MSDN文档页面上的注释表明它需要进行一些更新)
答案 1 :(得分:1)
尝试
int foo;
HWND bar = (HWND)&foo;
答案 2 :(得分:0)
我发现long long
可转换为HWND
:
long long llHwnd = 133282;
HWND hwnd = (HWND)llHwnd;
如果找到答案,我会提供原始答案的链接。