6

У меня ноутбук с Windows 10 с клавиатурой, созданной идиотами. Они пытались втиснуть клавиши со стрелками туда, где они не принадлежат, в результате чего клавиша со стрелкой вверх находится между правой клавишей Shift и клавишей / (раскладка клавиатуры США). Это одна из самых глупых вещей, которые могли бы сделать дизайнеры, потому что это означает, что когда я нажимаю правую клавишу Shift (что происходит чаще всего), я вместо этого нажимаю стрелку вверх. Это невероятно раздражает.

Я нашел программу под названием Sharp Keys, которая позволяет мне переназначать клавиши так, чтобы стрелка вверх действовала как сдвиг, а стрелка вправо - как стрелка вверх. Теперь, по крайней мере, я могу напечатать. Однако теперь я потерял важные функции для клавиши со стрелкой вверх. Стрелка вверх (теперь на клавиатуре помечена как "смещение") не повторяется. Так что я не могу просто удерживать ключ, чтобы двигаться вверх. Вместо этого я должен нажать клавишу несколько раз. Как я могу это исправить, чтобы моя правая клавиша Shift работала как стрелка вверх, а моя стрелка вверх - как правая клавиша?

РЕДАКТИРОВАТЬ

Следуя предложению из комментариев, я установил AutoHotkey. У меня есть следующий скрипт:

RShift::Up
Up::RShift

У меня та же проблема, что и раньше. Но, поскольку AHK является языком сценариев, возможно ли использовать его для изменения поведения повторения?

3 ответа3

2

Проблема со всеми остальными ответами состоит в том, что повторные нажатия клавиши Shift будут игнорироваться, потому что предыдущая подпрограмма горячих клавиш все еще выполняется. По умолчанию значение #MaxThreadsPerHotkey равно 1, а значение #MaxThreads равно 10.

Ниже приведены два возможных решения. Оба хорошо работают для меня.

Увеличьте #MaxThreadsPerHotkey (и #MaxThreads)

SendMode Input
#MaxThreads 150
#MaxThreadsPerHotkey 150

; return the send command including any pressed modifier keys
getSendCommand() {
    sendCmd = {Up}
    sendCmd = % GetKeyState("LAlt", "P") ? "!" . sendCmd : sendCmd
    sendCmd = % GetKeyState("LCtrl", "P") ? "^" . sendCmd : sendCmd
    sendCmd = % GetKeyState("LShift", "P") ? "+" . sendCmd : sendCmd
    sendCmd = % GetKeyState("Win", "P") ? "#" . sendCmd : sendCmd
    return sendCmd
}

*$RShift::
    ; Immediately send an up key
    Send % getSendCommand()
    Sleep, 450

    While GetKeyState("RShift", "P") {  ; while key remains pressed
        Send % getSendCommand()  ; keep sending up keys
        Sleep, 30
    }
    Return

Немедленно прервать выполнение при отпускании клавиши Shift

SendMode Input

; return the send command including any pressed modifier keys
getSendCommand() {
    sendCmd = {Up}
    sendCmd = % GetKeyState("LAlt", "P") ? "!" . sendCmd : sendCmd
    sendCmd = % GetKeyState("LCtrl", "P") ? "^" . sendCmd : sendCmd
    sendCmd = % GetKeyState("LShift", "P") ? "+" . sendCmd : sendCmd
    sendCmd = % GetKeyState("Win", "P") ? "#" . sendCmd : sendCmd
    return sendCmd
}

*$RShift::
    ; Immediately send an up key
    Send % getSendCommand()

    ; Initial wait period (sleep time = 350 ms, execution time ~450 ms)
    Loop 35 {  ; Check keystate every 10 ms, abort execution as soon as shift is released
        Sleep, 10  ; 10 ms is the shortest possible sleep interval
        if not GetKeyState("RShift", "P") {
            return
        }
    }

    ; Start repeating if and while key is still pressed. Stop execution as soon as shift is released
    While GetKeyState("RShift", "P") {
        Send % getSendCommand()

        Loop 2 {
            if not GetKeyState("RShift", "P") {
                return
            }
            Sleep, 10
        }
    }
    Return
2

Я попробовал горячие клавиши, которые вы перечислили ... они отлично работали для меня и автоматически повторялись просто отлично, когда удерживали ...

#Persistent
Return

#IfWinActive    ; Make replacement operate globally
RShift::Up
Up::RShift

Вы можете попробовать другой SendMode ...

RShift::SendInput {Up}
Up::SendInput {RShift}

или же...

RShift::SendPlay {Up}
Up::SendPlay {RShift}

У вас есть другие программы, которые перехватывают эти или что-то подобное? Повторяется ли клавиша нормально, когда скрипт не запущен?

Настройка пользовательского цикла может выглядеть примерно так ...

RShift::
    While GetKeyState("RShift", "P") {
        Send {Up}
        Sleep 50    ; Set delay to taste
    }
Return

РЕДАКТИРОВАТЬ

Чтобы удовлетворить потребность в других модификаторах, можно использовать «*» с горячей клавишей, хотя в случае наличия двух клавиш Shift по умолчанию она может работать некорректно. Я добавил специальный случай для определения клавиши Shift, но я не знаю, как это сработало бы, если бы вы добавили в микс другие модификаторы ... в этом случае вы могли бы посмотреть на добавление модификатора {blind} к Send заявления, чтобы увидеть, если вы могли бы заставить его работать должным образом.

Чтобы устранить «условие гонки», можно добавить еще одну задержку перед повторением перед циклом повторения вместе с начальным оператором отправки (см. Ниже).

*Up::SendInput {blind}{RShift Down}
*Up Up::SendInput {blind}{RShift Up}

*RShift::
    Send % GetKeyState("LShift", "P") ? "+{Up}" : "{Up}"
    Sleep 250           ; Initial delay before repeat
    While GetKeyState("RShift", "P") {
        Send % GetKeyState("LShift", "P") ? "+{Up}" : "{Up}"
        Sleep 100    ; Repeat delay
    }
Return
0

Хотя ответ JJohnston2 дал мне часть решения, я решил спросить несколько других мест и сам много экспериментировать. Вот что я в итоге получаю:

Up::RShift
*RShift::
    delay=400
    While GetKeyState("RShift", "P") {
        Send {Blind}{Up}
        Sleep %delay%    ; Set delay to taste
        delay=30
    }
    Return

Это решает проблемы повторения клавиш и позволяет shift+up работать как положено. Есть две нерешенные проблемы, которые я не решил, но которые имеют достаточно низкий приоритет, и я все равно буду считать этот вопрос решенным:

  1. Состояние гонки не решено. Я попытался поместить первую итерацию за пределы цикла, как это сделал JJohnston2, но для меня это не оказало заметного эффекта.
  2. Основная причина всех этих проблем заключается в том, что система, кажется, не повторяет клавиши Shift, Ctrl или Alt, хотя другие повторяются. Итак, АХК не может повторить то, что никогда не видит. Поскольку у всех, кого я просил о помощи, этой проблемы не было, в моей настройке должно быть что-то странное, но я не имею ни малейшего представления, что это может быть.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .