ShowCursor(FALSE) 不在控制台应用程序上隐藏光标

Posted

技术标签:

【中文标题】ShowCursor(FALSE) 不在控制台应用程序上隐藏光标【英文标题】:ShowCursor(FALSE) does not hide cursor on console application 【发布时间】:2017-03-30 07:00:33 【问题描述】:

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

我已经提到了这个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.

我想也许在最新的 Windows 中,它无法将连接的鼠标或触控板识别为已安装的鼠标,也许这就是它不起作用的原因。以下代码表明情况并非如此:

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);

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

【问题讨论】:

我认为这不可能。 ShowCursor 必须从窗口的线程中调用,但控制台窗口属于不同的进程。 @Axalo 哦,在这种情况下,如果我们获取桌面窗口句柄然后尝试关闭光标,是否有可能? 它实际上是 cmd.exe 或 conhost.exe。它与桌面无关。 为什么要在控制台应用程序中隐藏鼠标?在控制台应用程序中,实际上 没有鼠标。控制台应用程序不是为使用鼠标而设计的。控制台窗口有自己的光标,通常形状像一个小盒子,有时会闪烁。你确定不是你要隐藏的那个吗? 【参考方案1】:

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

Resource Files-&gt;Add-&gt;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);

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

希望这会有所帮助。

【讨论】:

以上是关于ShowCursor(FALSE) 不在控制台应用程序上隐藏光标的主要内容,如果未能解决你的问题,请参考以下文章

C#ShowCursor光标的显示与隐藏

隐藏和显示鼠标

如何在 Windows 中隐藏光标? (德尔福)

为啥unity中使用Screen.showCusor=false之后鼠标中game视图下依然显示呢?

http_only = false 时不在 document.cookie 列表中的 cookie

OutputDebugString 函数不在我的控制台应用程序中发送消息