Производительность программирования: как скрыть курсор при наборе текста


9

Всякий раз, когда я щелкаю где-нибудь, чтобы напечатать какой-то код, по определению именно там находится мой курсор мыши, который скрывает то, что я пытаюсь напечатать. Часто, если я забуду переместить курсор в сторону, прежде чем начать печатать, я обнаружу, что перемещаю руку от клавиатуры обратно к моей мыши, просто чтобы убрать курсор с пути и затем вернуться к вводу текста.

Я знаю, что есть опция «скрыть курсор при наборе текста» на уровне ОС, но в Visual Studio это никак не влияет.

Кроме того, я знаю утилиты, которые могут работать постоянно в фоновом режиме (например, CursorHider ), но, по соображениям стабильности, мне не терпится запустить еще один фоновый сервис поверх многих уже запущенных.

Есть ли решение?


Хороший вопрос для superuser.com. :-)
Франси Пенов

Ну, вы могли бы использовать Mac ...
dmckee --- котенок экс-модератора

Для меня удаление мыши - это рефлекс, о котором я даже не думаю. (то есть, пока я не перестал использовать обычные редакторы и не начал использовать vim)
hasen

Ответы:


5

Как и у вас, у меня была эта проблема навсегда. Поэтому я написал небольшой скрипт, который скрывает курсор мыши независимо от того, какое приложение Windows вы используете.

Обратите внимание, что если вы запускаете Visual Studio (или что-то еще) в режиме с повышенными правами, вам нужно будет запустить мою утилиту также и в режиме с повышенными правами.


У меня есть сомнения, является ли такой силовой метод правильным во всех ситуациях. Курсор исчезает всякий раз, когда набирается любая клавиша, например, это может сильно раздражать в играх.
Harrymc

В этом случае вы можете просто выгрузить его во время игры ... при этом, я думаю, что большинство игр реализуют свой собственный курсор
Stefan Z Camilleri

Windows-Cursor-Hider пока работает хорошо. Я искал что-то простое, как сценарий AHK. Спасибо @StefanZCamilleri!
russds

3

Кажется, что функциональность «скрыть указатель во время набора» зависит от приложения.

Этот параметр отмечен в параметрах указателя моей мыши и работает для таких приложений, как блокнот, WordPad, Word и Visual Studio 6. Но он не работает для других приложений, таких как Firefox и Visual Studio 2008.

Я считаю, что приложения, в которых это не работает, неправильно запрограммированы на повторное отображение курсора. Как программист, я могу вам сказать, что программирование курсора в Windows - это большой беспорядок, где, наконец, единственный способ сохранить здравый смысл - это многократно восстанавливать курсор при определенных событиях. Очевидно, что программисты Visual Studio 2008 использовали те же ярлыки.


Хотя это неверное предположение, поскольку, если вы скрываете курсор на уровне операционной системы, он останется скрытым, что лишит вас идеи заставить курсор отображаться (что переопределит его) - пожалуйста, смотрите мой ответ ниже
Stefan Z Camilleri

1

Я знаю, что это, вероятно, не жизнеспособное решение для вас, но мне нравится вообще не использовать мышь из-за привязки клавиш для всего в IDE. Я могу переходить от панели к панели, ошибки к ошибке и т. Д., Не касаясь мыши. Также, если ваши классы хорошие и маленькие, вам не нужно будет слишком много прокручивать вверх и вниз (и даже если бы вам понадобились клавиши со стрелками, этого было бы достаточно).


0

Вы можете избежать «скрытия указателя при наборе текста», перехватывая EN_UPDATE в WndProc родительского окна элемента управления редактирования и устанавливая положение курсора:

void CreateEdit( HWND hWnd )
{

    WNDCLASSEX wndClass;

    memset( &wndClass, 0, sizeof( wndClass ) );

    wndClass.cbSize = sizeof( wndClass );
    wndClass.style = CS_SAVEBITS;
    wndClass.lpfnWndProc = WndProcEditParent;
    wndClass.cbClsExtra = 0;
    wndClass.cbWndExtra = 0;
    wndClass.hInstance = GetModuleHandle( NULL );
    wndClass.hIcon = NULL;
    wndClass.hCursor = NULL;
    wndClass.hbrBackground = NULL;
    wndClass.lpszMenuName = NULL;
    wndClass.lpszClassName = L"EditParent";

    RegisterClassEx( &wndClass );

    HWND hWndEditParent = CreateWindowEx( 0
        , L"EditParent"
        , L""
        , WS_CHILD | WS_BORDER
        , 0
        , 0
        , 0
        , 0
        , hWnd
        , NULL
        , GetModuleHandle( NULL )
        , 0 );

    HWND hWndEdit = CreateWindowEx( 0
        , L"Edit"
        , L""
        , WS_CHILD
        , 0
        , 0
        , 0
        , 0
        , hWndEditParent
        , NULL
        , GetModuleHandle( NULL )
        , 0 );

    ...
}


LRESULT CALLBACK Edit::WndProcEditParent( HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam )
{
    switch( iMessage )
    {
        ...
        case WM_COMMAND:
            if( HIWORD( wParam ) == EN_UPDATE )
            {
            // this is the hack to avoid "hide pointer while typing"
                POINT point;

                GetCursorPos( &point );
                SetCursorPos( point.x, point.y );
            }
            break;
        ...
    }

    return DefWindowProc( hWnd, iMessage, wParam, lParam );
}

1
Это может быть действительно хороший ответ, но я не знаю, как его использовать. Пожалуйста, добавьте объяснение. Не отвечайте в комментариях; отредактируйте  свой ответ, чтобы сделать его более понятным и полным.
G-Man говорит «Восстановить Монику»
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.