Buat tombol shift berperilaku seperti tombol panah

6

Saya memiliki laptop Windows 10 dengan keyboard yang dirancang oleh para idiot. Mereka mencoba menjejalkan tombol panah di tempat yang tidak seharusnya, dengan hasil bahwa tombol panah atas adalah antara tombol shift kanan dan tombol / (tata letak keyboard AS). Ini adalah salah satu hal paling bodoh yang bisa dilakukan oleh perancang, karena itu berarti bahwa ketika saya pergi untuk menekan tombol shift kanan (yang sebagian besar waktu), saya akhirnya malah memukul panah. Ini sangat menjengkelkan.

Saya menemukan sebuah program yang disebut Tombol Tajam yang memungkinkan saya untuk memetakan kembali tombol sedemikian rupa sehingga panah atas berperilaku sebagai pergeseran dan pergeseran kanan berperilaku sebagai panah atas. Sekarang, setidaknya saya bisa mengetik. Namun, saya sekarang kehilangan fungsionalitas penting untuk tombol panah atas. Panah atas (sekarang diberi label "shift" di keyboard saya) tidak mengulangi. Jadi, saya tidak bisa hanya menahan kunci untuk naik. Sebaliknya, saya harus menekan tombol berulang kali. Bagaimana saya bisa memperbaikinya, sehingga kunci shift kanan saya berperilaku seperti panah atas dan kunci panah atas saya berperilaku seperti shift kanan?

EDIT

Mengikuti saran dari komentar, saya menginstal AutoHotkey. Saya memiliki skrip berikut:

RShift::Up
Up::RShift

Saya memiliki masalah yang sama seperti sebelumnya. Tetapi, karena AHK adalah bahasa scripting, apakah mungkin menggunakannya untuk mengubah perilaku berulang?

Scott Severance
sumber
Saya tahu frustrasi Anda dengan beberapa keyboard. Sudahkah Anda mencoba AHK? Saya mendengar tentang hal itu beberapa waktu lalu dan sekarang memiliki gudang AHK yang saya gunakan hampir setiap hari. Jika Anda memeriksanya, itu sangat luar biasa - membantu jika Anda memiliki latar belakang pemrograman yang sedikit. autohotkey.com Kemudian jika Anda ingin mendaftarkan pintasan Anda agar siap pada setiap login Anda dapat melakukannya dengan windows sebagai tugas memulai. Daftar kunci: autohotkey.com/docs/KeyList.htm Jika ini berhasil untuk Anda, saya dapat membantu Anda dengan kode. Ada kurva belajar.
ejbytes
Terima kasih telah menyebutkan Autohotkey. Saya mencobanya, dan sementara itu akan berguna untuk banyak tujuan, ia memiliki masalah yang persis sama seperti yang saya jelaskan di atas, kecuali ada cara untuk menggunakan AHK untuk memaksa perubahan dalam perilaku kunci repeaat.
Scott Severance
Bisakah Anda menggambarkan pengulangan? Tekan dan terlalu banyak pengulangan? Dengan AHK ada timing yang dapat Anda atur, atau bahkan tekan + Tahan perintah. Apakah ini membantu? Jadi naik, tetapi jika Anda memegangnya terus naik. Atau sesuatu yang lain?
ejbytes
Maksud saya ketika Anda menekan Atas, kursor bergerak ke atas satu baris dan berhenti, tidak peduli berapa lama Anda memegang kunci. Di AHK saya mencoba menulis loop Up:: untuk terus memeriksa apakah kunci itu turun dan mengirim kunci Naik lainnya. Tapi, tidak ada bedanya.
Scott Severance

Jawaban:

2

Saya mencoba hotkey yang Anda daftarkan ... mereka bekerja dengan baik untuk saya dan berulang secara otomatis baik-baik saja ketika ditekan ...

#Persistent
Return

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

Anda mungkin dapat mencoba yang lain SendMode...

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

atau...

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

Apakah Anda memiliki program lain yang mencegat ini atau semacamnya? Apakah pengulangan tombol berfungsi normal ketika skrip tidak berjalan?

Menyiapkan loop kustom mungkin terlihat seperti ini ...

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

EDIT

Untuk mengatasi perlunya pengubah lain bekerja, '*' dapat digunakan dengan tombol pintas, meskipun dalam kasus memiliki dua tombol shift itu mungkin tidak berfungsi dengan benar secara default. Saya telah menambahkan case khusus untuk deteksi tombol shift tapi saya tidak tahu bagaimana itu akan bekerja jika Anda ingin memasukkan pengubah lain ke dalam campuran ... dalam hal ini Anda bisa melihat menambahkan {blind} pengubah ke Send pernyataan untuk melihat apakah Anda bisa membuatnya berfungsi dengan baik.

Untuk mengatasi 'kondisi lomba', penundaan pra-pengulangan lain juga dapat ditambahkan sebelum pengulangan berulang bersama dengan pernyataan pengiriman awal (lihat di bawah).

*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
JJohnston2
sumber
Blok atas berfungsi dengan baik. Blok kedua dan ketiga, tekan dan lewatkan untuk keyboard saya. Sementara loop, dengan GetKeyState, berfungsi juga. Pekerjaan yang baik. Catatan untuk siapa saja yang menggunakan ini. Saya menggunakan loop sementara dalam contoh ini dan berfungsi. Windows, "Sticky Key" mengingatkan saya; tetapi pada waktu-waktu yang terputus-putus; jadi mungkin komentar "Setel tunda untuk merasakan" mungkin membantu dengan masalah itu jika itu tetap ada. API (Antarmuka Pemrogram Applicaiton) di sini menjelaskan apa itu GetKeyState dan bagaimana menggunakannya: autohotkey.com/docs/commands/GetKeyState.htm Suara positif dari saya (y)
ejbytes
Loop kebanyakan bekerja untuk saya. Yang lain tidak. Ini adalah mesin baru, jadi saya tidak bisa membayangkan mengapa kode yang berfungsi untuk semua orang gagal pada mesin saya; sama sekali tidak ada yang istimewa di sini. Bagaimanapun, sementara sebagian besar loop bekerja, saya masih punya dua masalah dengan itu. Pertama, sepertinya ada sedikit kondisi balapan, di mana jika saya menekan RShift berulang kali, kadang-kadang saya akan naik dua baris daripada satu untuk pukulan. Ini menjengkelkan, tapi tidak terlalu buruk.
Scott Severance
Masalah kedua, yang lebih penting, adalah Shift + Up tidak lagi berfungsi. Dengan Menambahkan loop yang sama aktif +Rshift:: dan menambahkan Send {Shift down} dan Send {Shift up} Saya bisa mendapatkan kursor naik ketika menekan shift kiri + new_up, tetapi tidak memiliki efek yang benar dalam memilih teks.
Scott Severance
Saya telah mengedit posting sebagai tanggapan atas komentar-komentar ini dan memberikan beberapa contoh kode lebih lanjut yang dapat Anda coba dan uji atau modifikasi.
JJohnston2
2

Masalah dengan semua jawaban lain adalah yang diulang bergeser pers akan diabaikan karena subrutin hotkey sebelumnya masih dijalankan. Secara default, #MaxThreadsPerHotkey adalah 1, dan #MaxThreads adalah 10.

Di bawah ini adalah dua solusi yang mungkin. Keduanya bekerja dengan baik untuk saya.

Tingkatkan #MaxThreadsPerHotkey (dan #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

Segera batalkan eksekusi ketika bergeser kunci dilepaskan

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
user914038
sumber
0

Sementara jawaban JJohnston2 memberi saya bagian dari solusi, saya akhirnya bertanya beberapa tempat lain dan melakukan banyak eksperimen sendiri. Inilah yang akhirnya saya akhiri:

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

Ini memecahkan masalah pengulangan kunci dan memungkinkan shift + hingga berfungsi seperti yang diharapkan. Ada dua masalah luar biasa yang belum saya pecahkan, tetapi yang cukup rendah dalam prioritas sehingga saya akan menganggap pertanyaan ini diselesaikan:

  1. Kondisi balapan tidak terpecahkan. Saya mencoba untuk menempatkan iterasi pertama di luar loop, seperti yang dilakukan JJohnston2, tetapi tidak memiliki efek yang dapat diamati bagi saya.
  2. Akar penyebab semua masalah ini adalah bahwa sistem tampaknya tidak mengulangi tombol shift, Ctrl, atau Alt, meskipun yang lain ulangi. Jadi, AHK tidak dapat mengulangi apa yang tidak pernah dilihatnya. Karena semua orang yang saya minta bantuan tidak memiliki masalah ini, pasti ada sesuatu yang funky dengan pengaturan saya, tetapi saya tidak memiliki ide foggiest apa itu.
Scott Severance
sumber