Pada Windows Forms , Anda bisa tahu, setiap saat, posisi saat ini berkat kursor ke Cursors kelas.
Hal yang sama sepertinya tidak tersedia untuk keyboard. Apakah mungkin untuk mengetahui jika, misalnya, Shifttombolnya ditekan?
Apakah benar-benar perlu untuk melacak setiap notifikasi keyboard (acara KeyDown dan KeyUp)?
Jawaban:
Ini juga akan benar jika Ctrl+ Shiftturun. Jika Anda ingin memeriksa apakah Shift saja yang ditekan,
Jika Anda berada di kelas yang mewarisi
Control
(seperti formulir), Anda dapat menghapus fileControl.
sumber
GetKeyState
fungsi API.Keyboard.Modifiers == ModifierKeys.Shift
(bagi mereka yang datang ke sini untuk mencari)(Control.ModifierKeys & Keys.Shift) != 0
dapat digunakanControl.ModifierKeys.HasFlag(Keys.Shift)
Kode di bawah ini adalah cara mendeteksi hampir semua tombol yang saat ini ditekan, bukan hanya tombolnya Shift.
sumber
GetKeyState
akan lebih efisien. Tidak ada gunanya melacak semua kunci ketika Windows sudah melakukannya untuk Anda.Anda juga dapat melihat berikut ini jika Anda menggunakan WPF atau referensi System.Windows.Input
Ruang nama Keyboard juga dapat digunakan untuk memeriksa status tombol lain yang ditekan dengan Keyboard.IsKeyDown (Key), atau jika Anda berlangganan KeyDownEvent atau acara serupa, argumen acara membawa daftar tombol yang saat ini ditekan.
sumber
Sebagian besar jawaban ini terlalu rumit atau sepertinya tidak berhasil untuk saya (misalnya System.Windows.Input sepertinya tidak ada). Kemudian saya menemukan beberapa kode contoh yang berfungsi dengan baik: http://www.switchonthecode.com/tutorials/winforms-accessing-mouse-and-keyboard-state
Jika halaman tersebut hilang di masa mendatang, saya memposting kode sumber yang relevan di bawah ini:
sumber
System.Windows.Input
ada; bagi orang lain yang berjuang dengan ini, Anda perlu menambahkan referensiPresentationCore
, dan referensi tambahanWindowsBase
untuk mengaksesSystem.Windows.Input.Key
pencacahan. Info ini selalu dapat ditemukan di MSDN.static
, bukanabstract
.Sejak .NET Framework versi 3.0, dimungkinkan untuk menggunakan
Keyboard.IsKeyDown
metode dariSystem.Windows.Input
namespace baru . Misalnya:Meskipun itu bagian dari WPF, metode itu berfungsi dengan baik untuk aplikasi WinForm (asalkan Anda menambahkan referensi ke PresentationCore.dll dan WindowsBase.dll ). Sayangnya, bagaimanapun, versi 3.0 dan 3.5 dari
Keyboard.IsKeyDown
metode ini tidak bekerja untuk aplikasi WinForm. Oleh karena itu, jika Anda ingin menggunakannya dalam aplikasi WinForm, Anda harus menargetkan .NET Framework 4.0 atau yang lebih baru agar dapat berfungsi.sumber
Keyboard.IsKeyDown
metode ini berfungsi, bahkan dalam proyek WinForm.Anda dapat P / Invoke ke Win32 GetAsyncKeyState untuk menguji tombol apa saja pada keyboard.
Anda dapat mengirimkan nilai dari enum Keys (mis. Keys.Shift) ke fungsi ini, jadi hanya memerlukan beberapa baris kode untuk menambahkannya.
sumber
Keyboard
tidak dikenali oleh kompiler, tetapiGetAsyncKeystate
di user32 bekerja dengan baik. Terima kasih!sumber
Cara terbaik yang saya temukan untuk mengelola input keyboard pada formulir Windows Forms adalah dengan memprosesnya setelah penekanan tombol dan sebelum kontrol terfokus menerima acara tersebut. Microsoft mempertahankan
Form
properti tingkat bawaan bernama .KeyPreview untuk memfasilitasi hal yang tepat ini:Kemudian peristiwa _KeyDown, _KeyPress, dan / atau _KeyUp formulir dapat diatur untuk mengakses peristiwa masukan sebelum kontrol formulir terfokus pernah melihatnya, dan Anda dapat menerapkan logika pengendali untuk menangkap peristiwa di sana atau membiarkannya melewati ke kontrol formulir terfokus .
Meskipun secara struktural tidak anggun seperti arsitektur perutean peristiwa XAML , hal itu membuat pengelolaan fungsi tingkat bentuk di Winforms jauh lebih sederhana. Lihat catatan MSDN di KeyPreview untuk peringatan.
sumber
tidak berfungsi untuk kotak teks jika kode di atas berada dalam peristiwa keydown formulir dan tidak ada kontrol lain yang menangkap peristiwa keydown untuk tombol bawah.
Juga seseorang mungkin ingin menghentikan pemrosesan kunci lebih lanjut dengan:
sumber
Posisi x / y kursor adalah properti, dan penekanan tombol (seperti klik / mousemove mouse) adalah peristiwa. Praktik terbaik biasanya membiarkan antarmuka digerakkan oleh peristiwa. Tentang satu-satunya waktu yang Anda perlukan di atas adalah jika Anda mencoba melakukan shift + klik mouse.
sumber
Di WinForms:
Kedengarannya seperti duplikat pertanyaan Stack Overflow, Deteksi tombol Shift ditekan tanpa menggunakan acara di Windows Forms? .
sumber