2010-03-22 29 views
6

khi chúng tôi nhấn một phím và tiếp tục nhấn phím đó, sự kiện nhấn phím và nhấn phím liên tục sẽ kích hoạt. Có cách nào để cho những đám cháy này chỉ sau một chu kỳ hoàn chỉnh, ví dụ như phím tắt và sau đó khóa lên.làm thế nào để không cho phép nhiều keystokes nhận được tại một phím bấm?

Tôi muốn người dùng không thể nhấn phím liên tục thay vì muốn người dùng phải nhấn rồi nhả bảng khóa để nhập ký tự!

để trường hợp sau không xảy ra, ví dụ: pppppppppppppppppppppppppp khi người dùng nhấn 'p' trong 1 giây.

Trả lời

7

Khai báo boolean isKeyDown, trong sự kiện KeyDown Sự kiện, đặt boolean thành true. Trong sự kiện KeyUp, đặt boolean thành false.

Đây là mẫu mã

bool isKeyDown=false; 
public void control_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) 
{ 
    if(isKeyDown) 
     return; 
    isKeyDown=true; 
    // do what you want to do 
} 

public void control1_KeyUp(object sender, System.Windows.Forms.KeyEventArgs e) 
{ 
    isKeyDown=false; 
    // do you key up event, if any. 
} 
+0

Khi áp phích được nêu, cả hai sự kiện sẽ kích hoạt (keyDown theo sau là keyUp) ngay cả khi đó là khóa lặp lại – Ian

+0

@iAn: điều đó không đúng. bạn nhận được các phím tắt lặp đi lặp lại, nhưng chỉ có một khóa. –

+0

@iAn: MSDN nói cách khác: "Sự kiện KeyDown xảy ra khi người dùng nhấn bất kỳ phím nào. Sự kiện KeyUp xảy ra khi người dùng nhả phím. Sự kiện KeyDown trùng lặp xảy ra mỗi khi phím lặp lại, nếu phím được giữ, nhưng chỉ một sự kiện KeyUp được tạo khi người dùng nhả phím. " – Niki

2

Để ngăn chặn một chìa khóa từ bắn nhiều lần khi tổ chức xuống: bạn phải sử dụng SuppressKeyPress tài sản như sau:

bool isKeyRepeating = false; 

public void textBox1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) 
{ 
    if (isKeyRepeating) 
    { 
     e.SuppressKeyPress = true; 
    } 
    else 
    { 
     isKeyRepeating = true; 
    } 

} 

public void textBox1_KeyUp(object sender, System.Windows.Forms.KeyEventArgs e) 
{ 
    isKeyRepeating = false; 
} 

Xem: KeyEventArgs..::.Handled Property ... và ... KeyEventArgs..::.SuppressKeyPress Property .... để biết thông tin có liên quan

+0

Âm thanh về quyền. –

+0

Nếu bạn đặt Biểu mẫu 'Chế độ xem chính xác' thành true và sử dụng cùng một mã (ở trên) trong Trình xử lý KeyDown và KeyUp của Biểu mẫu: tất cả các Hộp văn bản trên Biểu mẫu đó sẽ bị khóa lặp lại. Tôi đã không thử nghiệm nó trên các điều khiển khác hơn TextBoxes. Thực tế là Nobugz (người thông minh hơn tôi) đã đưa ra một câu trả lời dưới đây cho thấy mã này, ngay cả ở cấp Mẫu sẽ không ngăn chặn việc lặp lại khóa trong một số điều kiện khác mà tôi không biết. – BillW

5

Bạn có thể thực hiện toàn bộ ứng dụng bằng cách lọc thông báo chính bằng IMess ageFilter. Dưới đây là ví dụ:

public partial class Form1 : Form, IMessageFilter { 
    public Form1() { 
     InitializeComponent(); 
     Application.AddMessageFilter(this); 
     this.FormClosed += (s, e) => Application.RemoveMessageFilter(this); 
    } 

    private Keys mLastKey = Keys.None; 

    public bool PreFilterMessage(ref Message m) { 
     if (m.Msg == 0x100 || m.Msg == 0x104) { 
     // Detect WM_KEYDOWN, WM_SYSKEYDOWN 
     Keys key = (Keys)m.WParam.ToInt32(); 
     if (key != Keys.Control && key != Keys.Shift && key != Keys.Alt) { 
      if (key == mLastKey) return true; 
      mLastKey = key; 
     } 
     } 
     else if (m.Msg == 0x101 || m.Msg == 0x105) { 
     // Detect WM_UP, WM_SYSKEYUP 
     Keys key = (Keys)m.WParam.ToInt32(); 
     if (key == mLastKey) mLastKey = Keys.None; 
     } 
     return false; 
    } 
    } 

Một điều tôi theo đuổi là số đếm lặp lại trong thông báo WM_KEYDOWN. Thật kỳ quặc điều này đã không làm việc trên máy tính của tôi, nó là 1 cho các phím lặp lại. Không chắc chắn lý do tại sao.

+0

@nobugz +1 Tôi luôn học được rất nhiều từ câu trả lời của bạn! Những thứ rất thú vị đang diễn ra ở trên với việc xóa MessageFilter trên Form Closed. Tôi đoán rằng bạn đi "sâu này" trong câu trả lời của bạn để bao gồm mọi trường hợp có thể kiểm soát đầu vào? Tôi cho rằng không có cách nào để xử lý điều này trên cơ sở Toàn bộ ứng dụng sẽ độc lập với bất kỳ Biểu mẫu nào? – BillW

+0

@BillW: Cảm ơn! Đây là toàn bộ ứng dụng, IMessageFilter hoạt động cho tất cả các biểu mẫu. Nếu nó chỉ nên hoạt động cho một hình thức thì đây không phải là giải pháp đúng. Tôi cho rằng đây là một số loại ứng dụng chơi game nên nó sẽ ổn. –

+0

Tất nhiên, bây giờ tôi có thể thấy ứng dụng của nó rộng và tự hỏi làm thế nào tôi bỏ lỡ khi bắt đầu với :) – BillW

Các vấn đề liên quan