初学者:“HCURSOR”到“const char *”强制转换,使用IF语句检测光标图标的变化

时间:2017-09-25 23:48:23

标签: c++ pointers winapi casting

  • 背景

这是C / C ++代码,用于检测光标图标何时发生变化,并将光标当前图像的指针值传递给printf。

#include <windows.h>
#include <stdio.h>

void CursorIcon()
{
  CURSORINFO ci = { sizeof(ci) };
  GetCursorInfo(&ci);
  printf("handle = %p\n", ci.hCursor);
}

int main(){
  CursorIcon();
}  

例如:当光标使用默认箭头图像时,printf表示指针值为“0000000000010005”。

  • 问题
    找到上述值后,我希望在 cursorIcon() printf 之后的if语句中使用它功能详述如下

    if(ci.hCursor=="0000000000010005"){
     printf("This is an arrow mouse icon!");  
    

    但是,我给出了这个错误“ 不同指针类型之间的比较'HCURSOR {aka HICON __ }'和'const char *'缺少一个强制转换[-fpermissive]

  • 尝试解决方案

    1. 当在if语句中使用'0000000000010005'(或0000000000010005)时,编译器会说 “ISO C ++禁止指针和整数之间的比较[-fpermissive]” < / LI>
    2. 所以我试图阅读'Casts',并且我尽最大努力将IF语句转换为我认为正确投射给出的原始错误,尝试我的静态演员的尝试,这似乎是不正确的(并添加了#include <iostream>):我尝试了if(ci.hCursor==(HCURSOR)0000000000010005)if(ci.hCursor==static_cast<HCURSOR>0000000000010005)

现在,我在这里遇到了一个小小的头痛,并且对于解决这个问题的地方有点困惑。

1 个答案:

答案 0 :(得分:0)

%p打印的数字格式是特定于实现的。 Microsoft实现打印0填充hexadecimal number。如果要在代码中使用它,则必须在其前面添加0x并添加强制转换。对于0000000000010005,您将使用if (cursorhandle == (HCURSOR) 0x010005) ...

正如评论中指出的那样,硬编码这个数字并不是正确的方法,因为标准的光标句柄值没有记录为稳定。您应该通过调用LoadCursor来获取光标句柄:

HCURSOR hArrow = LoadCursor(NULL, IDC_ARROW);
if (ci.hCursor == hArrow) printf("This is the standard arrow cursor\n");