Tôi phải sử dụng những gì để có thể nhận được "tất cả các phím" được nhấn trên bàn phím vào lúc này? Vì Form.KeyPress += new EventHandler()
không làm gì nhiều khi nó chứa đầy các điều khiển. Nó không gọi nó là bất kể tôi làm gì, KeyDown, KeyUp hay bất cứ thứ gì khác ... và vâng, tôi biết cách sử dụng chúng. Vì vậy, nếu có bất kỳ chức năng nào trong hệ thống có thể kiểm tra các phím bấm, nó sẽ trả về một mảng các phím được sử dụng hoặc một cái gì đó - tôi sẽ biết ơn khi được chỉ dẫn đúng hướng.Nhận tất cả các phím được nhấn
Trả lời
Có vẻ như bạn muốn truy vấn trạng thái của tất cả các phím trong bàn phím. Các chức năng tốt nhất cho điều đó là Win32 API gọi GetKeyboardState
Tôi không tin rằng có một tương đương quản lý tốt các chức năng đó. Mã PInvoke cho nó là khá thẳng về phía trước
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool GetKeyboardState(byte [] lpKeyState);
var array = new byte[256];
GetKeyboardState(array);
này sẽ cư byte[]
với lên/xuống trạng thái của mỗi phím ảo trong hệ thống. Nếu bit cao được đặt thì khóa ảo hiện đang được nhấn. Ánh xạ một Key
tới mã khóa ảo được thực hiện bằng cách chỉ xem xét phần byte
của giá trị số Key
.
public static byte GetVirtualKeyCode(Key key) {
int value = (int)key;
return (byte)(value & 0xFF);
}
Các công trình trên cho hầu hết các Key
giá trị nhưng bạn cần phải cẩn thận với các phím modifier. Các giá trị Keys.Alt
, Keys.Control
và Keys.Shift
sẽ không hoạt động ở đây vì chúng là các công cụ sửa đổi kỹ thuật chứ không phải giá trị khóa. Để sử dụng từ bổ nghĩa bạn cần phải sử dụng các giá trị quan trọng liên quan đến thực tế Keys.ControlKey
, Keys.LShiftKey
, vv ... (thực sự bất cứ điều gì mà kết thúc với Key)
Vì vậy, kiểm tra nếu một phím đặc biệt được thiết lập có thể được thực hiện như sau
var code = GetVirtualKeyCode(Key.A);
if ((array[code] & 0x80) != 0) {
// It's pressed
} else {
// It's not pressed
}
Nó cũng hoạt động với các phím bổ trợ, tuy nhiên bạn phải sử dụng Keys.AltKey, ShiftKey và ControlKey. –
@HansPassant gọi tốt, quên những mục đó – JaredPar
Vâng ... Nhưng một người chưa từng sử dụng những thứ đó trước khi nó có thể là tốt để bao gồm những không gian tên tôi cần, tại sao DllImport cho thấy màu đỏ, tại sao GetKeyboardState không phải là hư không được tìm thấy , v.v. ... Câu trả lời nửa nướng có nghĩa là tôi phải tìm kiếm thêm câu trả lời bằng không có câu trả lời. – Deukalion
Tôi tin rằng bạn đang tìm kiếm sự kiện PreviewKeyDown sẽ kích hoạt nếu một phím được nhấn trong khi biểu mẫu có tiêu điểm, ngay cả khi một điều khiển con khác trong biểu mẫu đó hiện có tiêu điểm.
Nếu bạn chỉ cần biết tất cả các lần nhấn phím khi ứng dụng của bạn đang hoạt động, bất kể điều khiển nào trong ứng dụng của bạn có tiêu điểm, bạn có thể sử dụng thuộc tính KeyPreview
của biểu mẫu.
Chỉ cần đặt thuộc tính thành true và đăng ký các sự kiện chính mong muốn trên biểu mẫu. Bây giờ bạn sẽ nhận được tất cả các tổ hợp phím trong ứng dụng của bạn trước khi chúng được chuyển tiếp đến điều khiển cụ thể, cho phép bạn tự phản ứng trên nó và hủy chuyển tiếp đến điều khiển được thiết lập thuộc tính Cancel
thành true.
Nếu bạn cần nhận các phím được bấm trong khi ứng dụng của bạn không phải là khóa đang hoạt động, thì bạn cần một số loại móc khóa bàn phím mức thấp. Tôi đã không kiểm tra nó, nhưng this article on CodeProject trông khá hứa hẹn cho trường hợp này.
Tôi đã mở rộng câu trả lời của JaredPar một chút.Phương pháp sau đây trả về bộ sưu tập của tất cả các phím hiện đang được nhấn:
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Windows.Input;
private static readonly byte[] DistinctVirtualKeys = Enumerable
.Range(0, 256)
.Select(KeyInterop.KeyFromVirtualKey)
.Where(item => item != Key.None)
.Distinct()
.Select(item => (byte)KeyInterop.VirtualKeyFromKey(item))
.ToArray();
/// <summary>
/// Gets all keys that are currently in the down state.
/// </summary>
/// <returns>
/// A collection of all keys that are currently in the down state.
/// </returns>
public IEnumerable<Key> GetDownKeys()
{
var keyboardState = new byte[256];
GetKeyboardState(keyboardState);
var downKeys = new List<Key>();
for (var index = 0; index < DistinctVirtualKeys.Length; index++)
{
var virtualKey = DistinctVirtualKeys[index];
if ((keyboardState[virtualKey] & 0x80) != 0)
{
downKeys.Add(KeyInterop.KeyFromVirtualKey(virtualKey));
}
}
return downKeys;
}
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool GetKeyboardState(byte[] keyState);
Tôi haviong một thời gian khó dịch việc phân bổ 'DistinctVirtualKeys' trong VB.Net. Bạn có thể nhận xét nó tốt hơn và tôi cũng nhận được lỗi rằng không có tham số cho '.Select (KeyInterop.KeyFromVirtualKey)'? – beppe9000
- 1. javascript nhấn phím enter
- 2. jqGrid nhận được tất cả id
- 3. javascript - phát hiện phím ctrl được nhấn hoặc lên, sự kiện nhấn phím không kích hoạt
- 4. Nhận tất cả các biến được gửi bằng POST?
- 5. Nhận tất cả các hàng không được lọc từ jqGrid
- 6. android + gmail + feed + nhận được TẤT CẢ các thư
- 7. CakePHP không nhận được tất cả các trường từ DB?
- 8. Twitter4j TwitterStream không nhận được tất cả các tweet
- 9. JavaScript Nhận tất cả các tập lệnh được tải
- 10. Pipe tất cả các lệnh bàn phím tự động đến một instance mplayer nhúng khi một phím modifier được nhấn trong pyqt4
- 11. Phím 'Ctrl' có được nhấn không?
- 12. Tại sao móc khóa bàn phím của tôi nhận được các sự kiện liên tục và nhấn phím nhiều lần?
- 13. nhận tất cả các trường từ DynamicForm
- 14. Nhận tất cả các hàng từ SQLite
- 15. Nhận tất cả các thẻ từ taggit
- 16. Nhận tất cả các yếu tố iframe
- 17. Kích hoạt sự kiện nhấn phím bàn phím mà không cần nhấn phím từ bàn phím
- 18. Nhận tất cả các phím trong từ điển giá trị chứa x
- 19. PHP Nhận tất cả các phím số/ẩn danh trong một mảng
- 20. giá trị xác nhận tất cả các phím trong một từ điển đã cư
- 21. Lặp lại tất cả các phím của bản đồ
- 22. Đóng tất cả các chủ đề bằng bàn phím ngắt
- 23. Nhận tất cả các loại thẻ nút
- 24. Hash xóa tất cả ngoại trừ các phím cụ thể
- 25. Thứ tự thay đổi/phím tắt/nhấn phím trong jQuery
- 26. Mở bàn phím mềm khi nhấn phím
- 27. Phím tắt để đóng tất cả các tab nhưng được ghim trong Visual Studio?
- 28. Làm cách nào để chấp nhận phím xóa lùi trong sự kiện nhấn phím?
- 29. Javascript/jQuery Nhấn phím ghi
- 30. không thể kích hoạt sự kiện nhấn phím khi nhấn phím xóa
Bạn có muốn tất cả các phím được nhấn khi bạn chạy một đoạn mã cụ thể hay bạn muốn một sự kiện xảy ra mỗi khi nhấn phím? – zimdanen
có thể trùng lặp của [Cách tốt nhất để thực hiện các phím tắt trong winforms?] (Http://stackoverflow.com/questions/400113/best-way-to-implement-keyboard-shortcuts-in-winforms) –
Nói rằng tôi muốn có một eventhandler cho MouseWheel, nhưng tôi muốn nhấn phím "Ctrl" khi tôi thực hiện một cái gì đó trong EventHandler. vì vậy nếu tôi di chuyển bánh xe, tôi chỉ nhận được kết quả của con lăn chuột, không phải phím bấm. – Deukalion