【发布时间】: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。它与桌面无关。
-
为什么要在控制台应用程序中隐藏鼠标?在控制台应用程序中,实际上 没有鼠标。控制台应用程序不是为使用鼠标而设计的。控制台窗口有自己的光标,通常形状像一个小盒子,有时会闪烁。你确定不是你要隐藏的那个吗?
标签: c++ windows mouse-cursor