ShowCursor(FALSE)不起作用

时间:2017-03-30 07:00:34

标签: c++ windows cursor mouse

我知道这可能听起来是一个重复的问题,但请相信我不是。

我已经提到了这个question,但是当我尝试使用console application并且回答者自己告诉他不知道ShowCursor(FALSE)不适用于控制台应用程序。

thread对我也没有帮助。

以下是我尝试过的事情:

使用ShowCursor():

while(ShowCursor(false)>=0); //did not work

我首先怀疑是因为msdn中的这句话: When Windows starts up, it checks if you have a mouse. If so, then the cursor show count is initialized to zero; otherwise, it is initialized to negative one 我想也许在最新的窗口中,它不会将连接的鼠标或触控板识别为已安装的鼠标,也许这就是为什么它不起作用。以下代码显示情况并非如此:

void UsingShowCursor()
{
    CURSORINFO info;
    info.cbSize = sizeof(CURSORINFO);
    cout << ShowCursor(FALSE);
    cout << ShowCursor(FALSE);
    cout << ShowCursor(FALSE);
    GetCursorInfo( &info ); //info.flags is CURSOR_SHOWING
}

因为我得到-1,-2,-3。这意味着初始显示光标计数显然为0,它确实识别已安装的鼠标。

另外需要注意的是GetCursorInfo()也告诉光标正在显示。

使用SetCursor()

void UsingSetCursor()
{
    HCURSOR prev = SetCursor(NULL);
    int i = 0;
    while(i++<10)
    {
        cout<<i<<endl;
        Sleep(1000);
    }
    if( SetCursor(prev) == NULL ) //check if the previos cursor was NULL
        cout<<"cursor was hidden and shown after 10 secs\n";
}

也不起作用。 这也行不通:

SetCursor(LoadCursor(NULL, NULL));

编辑:

使用LoadImage

也没用。

void UsingLoadImage()
{
    // Save a copy of the default cursor
    HANDLE arrowHandle = LoadImage(NULL, MAKEINTRESOURCE(IDC_ARROW), IMAGE_CURSOR, 0, 0, LR_SHARED);
    HCURSOR hcArrow = CopyCursor(arrowHandle);

    HCURSOR noCursorHandle = (HCURSOR)LoadImage(NULL, IDC_ARROW, IMAGE_CURSOR,1,1,LR_SHARED); //a single pixel thick cursor so that it wont be visible

    HCURSOR noCursor = CopyCursor(noCursorHandle);
    SetSystemCursor(noCursor, OCR_NORMAL);
    int i =0 ;
    while(i++<10)
    {
        cout<<i<<endl;
        Sleep(1000);
    }
    //revert to previous cursor
    SetSystemCursor(hcArrow, OCR_NORMAL);
    DestroyCursor(hcArrow);
}

可能是什么错误?我们如何为控制台应用程序隐藏鼠标?

1 个答案:

答案 0 :(得分:1)

您可以使用 LoadImage()来实现您的目标。以下是您在问题中引用的函数UsingLoadImage()的修改工作版本。您必须将光标资源文件包含在Visual Studio项目中。从here下载光标或创建自己的光标。

Resource Files->Add->Existng Item并浏览到nocursor.cur文件。

void UsingLoadImage()
{
    // Save a copy of the default cursor
    HANDLE arrowHandle = LoadImage(NULL, MAKEINTRESOURCE(IDC_ARROW), IMAGE_CURSOR, 0, 0, LR_SHARED);
    HCURSOR hcArrow = CopyCursor(arrowHandle);

    // Set the cursor to a transparent one to emulate no cursor
    HANDLE noCursorHandle = LoadImage(GetModuleHandle(NULL), L"nocursor.cur", IMAGE_CURSOR, 0, 0, LR_LOADFROMFILE); //worked
    //HANDLE noCursorHandle = LoadCursorFromFile(L"nocursor.cur"); //this also worked

    HCURSOR noCursor = CopyCursor(noCursorHandle);
    SetSystemCursor(noCursor, OCR_NORMAL);
    int i =0 ;
    while(i++<10)
    {
        cout<<i<<endl;
        Sleep(1000);
    }
    SetSystemCursor(hcArrow, OCR_NORMAL);
    DestroyCursor(hcArrow);
}

这将用透明箭头光标替换普通箭头光标。如果你想隐藏所有其他光标,如文本,加载,手游标等,你必须单独隐藏它们。如果您不希望出现这种情况,那么您应该选择退出控制台应用程序,就像许多评论者指出的那样。

希望这有帮助。