Tôi cần có khả năng xác định thời gian khóa được giữ với độ chính xác cao. Ví dụ: nếu khóa của họ gõ rất nhanh, nó có thể báo cáo thời gian ít hơn thời gian cho mỗi khung cập nhật.
Tôi cần có khả năng xác định thời gian khóa được giữ với độ chính xác cao. Ví dụ: nếu khóa của họ gõ rất nhanh, nó có thể báo cáo thời gian ít hơn thời gian cho mỗi khung cập nhật.
Câu trả lời:
Bạn có thể nắm bắt đầu vào bằng cách sử dụng lớp System.Windows.Forms.NativeWindow. Bạn sẽ nhận được thông báo khi một sự kiện đầu vào xảy ra. Bằng cách đó, bạn sẽ được thông báo nhanh nhất có thể ngay khi nó xảy ra, cho phép bạn ghi lại thời gian với độ chính xác cao hơn. Nó nhận được loại lộn xộn (mã gốc / không an toàn), nhưng nó hoạt động.
Tôi nghĩ rằng điều này chỉ hoạt động trên các cửa sổ, nhưng tôi nghĩ đó là nền tảng mà bạn nhắm mục tiêu (không cần điều này trên Xbox và WP7).
Đây là một ví dụ tốt (từ khung nuclex): WindowInputCapturer (lưu ý: mã này có thể đã được cập nhật gần đây và tôi đã không mã hóa nó)
Chỉnh sửa: Điều này cũng cho phép bạn lấy mã ký tự của phím bấm. Điều này có thể hữu ích cho việc nhập văn bản (đặc biệt là những thứ như ký tự Latinh) Tôi không chắc tại sao bạn cần phải nhập dữ liệu với độ chính xác cao như vậy, nhưng theo tôi thì đây là một cách tốt để làm điều đó.
Lưu trữ trạng thái khóa thành một biến và so sánh trên vòng lặp tiếp theo với trạng thái khóa hiện tại. Tạo một DateTime
đối tượng để giữ bắt đầu và bạn có thể so sánh với DateTime.Now
khi trạng thái khóa trước không khớp.
Ví dụ rất đơn giản về những gì tôi muốn nói:
if(currentKeyboardState.IsKeyDown(Keys.Space)
&& !previousKeyboardState.IsKeyDown(Key.Space))
{ DateTime startTime = DateTime.Now; }
...
if(!currentKeyboardState.IsKeyDown(Keys.Space)
&& previousKeyboardState.IsKeyDown(Key.Space))
{ TimeSpan elapsedTime = DateTime.Now - startTime; }
Tôi không biết bất kỳ cách chính thức nào để làm điều này, bạn có thể chạy một luồng thứ hai trong một vòng lặp rất chặt chẽ chỉ để kiểm tra đầu vào và gửi cái này đến một bộ đệm tròn đủ lớn để yêu cầu rất ít đồng bộ hóa giữa các luồng.
(Lưu trữ một số loại tăng số trong từng vị trí của bộ đệm và cập nhật SAU chủ đề đã ghi tất cả dữ liệu, sau đó tiếp tục đọc các vị trí có dữ liệu từ bộ đệm cho đến khi số giảm (đừng quên kiểm tra số tràn!))
Nếu bạn cập nhật ba mươi lần mỗi giây, con người sẽ không thể nhấn phím nhanh hơn bạn có thể lấy mẫu trạng thái bàn phím. Nếu bạn cập nhật chậm hơn con người có thể gõ, thì bạn có thể cần một luồng để kết xuất đồ họa và một luồng khác để đọc và phản hồi với bàn phím / chuột.
Nhưng, nếu bạn cập nhật chậm hơn con người có thể gõ, thì bạn cũng không thể cung cấp phản hồi trực quan cho mỗi lần nhấn phím. Điều này không quan trọng nếu ý tưởng là hiển thị phản hồi tổng hợp, chẳng hạn như thời gian trung bình giữa các lần nhấn phím.