在应用程序启动后立即使用ShowCursor(FALSE)隐藏鼠标光标

时间:2015-10-25 14:20:13

标签: c++ winapi

我需要在应用程序启动后立即隐藏鼠标光标。我正在使用ShowCursor(FALSE)。但是经常在ShowCursor(FALSE)之后光标仍然在屏幕上,直到鼠标移动。我和其他人在不同的PC上使用从XP到10的Windows重现了这一点。为了重现这一点,只需双击可执行文件从Windows资源管理器启动应用程序,绝对不要在双击时移动鼠标。如果以任何其他方式启动应用程序,则会按预期隐藏游标。当它停留在屏幕上时,它似乎属于Windows资源管理器,有时除了屏幕上的光标还有资源管理器工具提示。

代码并不总是有效:

#include <Windows.h>

LRESULT __stdcall WndProcFull(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    if (uMsg==WM_DESTROY)
    {
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hWnd, uMsg, wParam, lParam);
}

int __stdcall wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pszCmdLine, int iCmdShow)
{
    MSG msg;
    HWND hWnd;
    PCWSTR pszFullName=L"FullWindow";
    WNDCLASSEX wc={sizeof (WNDCLASSEX), 0, WndProcFull, 0, 0, hInstance, 0, LoadCursor(0, IDC_ARROW), (HBRUSH)GetStockObject(BLACK_BRUSH), 0, pszFullName, 0};
    RegisterClassEx(&wc);
    hWnd=CreateWindow(pszFullName, L"HideCursor", WS_POPUP | WS_MAXIMIZE | WS_VISIBLE, 0, 0, 0, 0, 0, 0, hInstance, 0);
    UpdateWindow(hWnd);
    ShowCursor(FALSE);
    while (GetMessage(&msg, 0, 0, 0)) DispatchMessage(&msg);
    return 0;
}

源代码在任何VS中编译。

目前唯一有用的是设置定时器,并在定时器间隔到期后,以编程方式移动鼠标光标,然后隐藏。但我更愿意找到更合适和稳定的解决方案。

代码与解决方法:

#include <Windows.h>

#define HIDECURSOR_TIMER_ID 1

LRESULT __stdcall WndProcFull(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_TIMER:
        POINT pt;
        GetCursorPos(&pt);
        SetCursorPos(pt.x+1, pt.y);
        KillTimer(hWnd, HIDECURSOR_TIMER_ID);
        return 0;
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hWnd, uMsg, wParam, lParam);
}

int __stdcall wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pszCmdLine, int iCmdShow)
{
    MSG msg;
    HWND hWnd;
    PCWSTR pszFullName=L"FullWindow";
    WNDCLASSEX wc={sizeof (WNDCLASSEX), 0, WndProcFull, 0, 0, hInstance, 0, LoadCursor(0, IDC_ARROW), (HBRUSH)GetStockObject(BLACK_BRUSH), 0, pszFullName, 0};
    RegisterClassEx(&wc);
    hWnd=CreateWindow(pszFullName, L"HideCursor", WS_POPUP | WS_MAXIMIZE | WS_VISIBLE, 0, 0, 0, 0, 0, 0, hInstance, 0);
    UpdateWindow(hWnd);
    ShowCursor(FALSE);
    SetTimer(hWnd, HIDECURSOR_TIMER_ID, 200, 0);
    while (GetMessage(&msg, 0, 0, 0)) DispatchMessage(&msg);
    return 0;
}

200 ms是光标稳定消失的最小超时值。

2 个答案:

答案 0 :(得分:2)

CreateWindow函数返回时,窗口仍未显示在屏幕上。您应该在实现后立即在早期窗口创建时调用ShowCursor函数。恕我直言,最好的地方是处理WM_CREATE消息时。代码将成为:

#include <Windows.h>

LRESULT __stdcall WndProcFull(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    if (uMsg==WM_DESTROY)
    {
        PostQuitMessage(0);
        return 0;
    }
    else if (uMsg == WM_CREATE) {
        ShowCursor(FALSE);
    }
    return DefWindowProc(hWnd, uMsg, wParam, lParam);
}

int __stdcall wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pszCmdLine, int iCmdShow)
{
    MSG msg;
    HWND hWnd;
    PCWSTR pszFullName=L"FullWindow";
    WNDCLASSEX wc={sizeof (WNDCLASSEX), 0, WndProcFull, 0, 0, hInstance, 0, LoadCursor(0, IDC_ARROW), (HBRUSH)GetStockObject(BLACK_BRUSH), 0, pszFullName, 0};
    RegisterClassEx(&wc);
    hWnd=CreateWindow(pszFullName, L"HideCursor", WS_POPUP | WS_MAXIMIZE | WS_VISIBLE, 0, 0, 0, 0, 0, 0, hInstance, 0);
    UpdateWindow(hWnd);
    //ShowCursor(FALSE);
    while (GetMessage(&msg, 0, 0, 0)) DispatchMessage(&msg);
    return 0;
}

这样,只要窗口创建并实现,您就会隐藏光标。

答案 1 :(得分:1)

根据the documentation

  

如果bShow为TRUE,则显示计数加1。如果bShow为FALSE,则显示计数减1。

所以要隐藏光标,你需要这样的东西:

while(ShowCursor(FALSE) >= 0);