2010-09-30 9 views
7

Khi xử lý sự kiện Control.OnKeyPress, có KeyPressEventArgs có chứa KeyChar.Lấy char trên Control.KeyDown?

Vì lý do khả năng sử dụng, tôi cần chính xác cùng một KeyChar nhưng khi xử lý sự kiện OnKeyDown.

KeyEventArgs không chứa bất kỳ dữ liệu liên quan đến char nào. Ý tôi là, nếu nhấn phím A có hoặc không có Shift, nó không ảnh hưởng đến KeyCode, KeyData hoặc KeyValue. Cũng giống như khi sử dụng một ngôn ngữ khác, tôi vẫn nhận được các giá trị vốn tiếng Anh.

Làm cách nào để nhận được KeyPressEventArgs.KeyChar bên trong sự kiện KeyDown?

Cảm ơn.

+2

Bạn muốn dùng phím Alt nào khi phím Alt được nhả? –

+1

'KeyPress' không kích hoạt khi phím Alt được nhả ra, tuy nhiên,' OnKeyDown' vẫn được kích hoạt, trong trường hợp này char '\ 0' là đủ tốt. – DxCK

Trả lời

9

Chuyển đổi. Đây là hàm đơn giản để chuyển đổi 'A' thành 'a'. Nó chỉ chuyển đổi các ký tự viết hoa từ [A-Z] được đặt. Giá trị 32 là khác nhau giữa 'A' và 'a' .. Chắc chắn bạn có thể mở rộng nó theo yêu cầu của bạn, hoặc yêu cầu tính năng ở đây.

char getChar(KeyEventArgs e) 
{ 
int keyValue = e.KeyValue; 
if (!e.Shift && keyValue >= (int) Keys.A && keyValue <= (int) Keys.Z) 
    return (char)(keyValue + 32); 
return (char) keyValue; 
} 

nếu bạn cần nó để làm việc với văn hóa hiện tại của bạn, bạn nên ghi đè phương pháp ProcessKeyMessage điều khiển:

protected override bool ProcessKeyMessage(ref Message m) 
{ 
if ((m.Msg == 0x102) || (m.Msg == 0x106)) // this is special - don't remove 
{ 
    char c = (char) m.WParam; // here is your char for OnKeyDown event ;) 
} 
return base.ProcessKeyMessage(ref m); 
} 

Hy vọng nó hữu ích.

+1

Và cách tôi xem xét ngôn ngữ đang hoạt động? ví dụ: nếu ngôn ngữ đang hoạt động là tiếng Nga, tôi muốn nhận các ký tự tiếng Nga. – DxCK

+1

Bạn nên ghi đè lên phương thức ProcessKeyMessage Control như được mô tả trong bài đăng của tôi. – mastak

+0

mã thứ hai là đủ, nó bắt shfit là tốt. – Letterman

0

Tôi nghĩ rằng những gì bạn đang tìm kiếm thực ra là thuộc tính KeyCode.

private void textBox1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) 
{ 
    // Determine whether the key entered is the F1 key. If it is, display Help. 
    if(e.KeyCode == Keys.A) 
    { 
     // Do something kewl 
    } 
    else if(e.KeyCode == Keys.B) 
    { 
     // Do something even kewler 
    } 
} 

Nếu bạn chỉ tìm kiếm một số khóa nhất định, bạn có thể thiết lập quy tắc chuyển đổi hoặc bất kỳ điều gì trái tim bạn mong muốn.

0

Nếu lý do bạn muốn sử dụng KeyDown thay vì KeyPress là nắm bắt thông tin bổ sung cho sự kiện KeyDown, bạn có thể nắm bắt thông tin bổ sung đó trong sự kiện KeyDown và sau đó sử dụng nó khi bạn lấy KeyPress ? Thay vào đó là cách tiếp cận hokey, để chắc chắn, nhưng tôi không chắc chắn về bất kỳ cách tiếp cận nào khác thực sự hoạt động trong ánh xạ bàn phím có "phím chết" (tức là chuỗi hai khóa tạo ra một ký tự đơn). Tôi không biết tại sao Microsoft không mang theo nhiều thông tin hơn đến sự kiện KeyPress (hoặc rất nhiều sự kiện của nó, vì vấn đề đó) vì cố gắng kết hợp các sự kiện gây ra hiệu ứng không hoàn hảo, nhưng tôi không 't thực sự biết bất kỳ thay thế tốt hơn.

+0

Lý do tôi muốn sử dụng 'KeyDown' thay cho' KeyPress' là giảm thời gian giữa người dùng nhấn phím cho đến khi phản hồi của chương trình của tôi. 'KeyPress' chỉ kích hoạt sau khi người dùng rời khỏi khóa và điều này thêm thời gian không cần thiết cho đến khi chương trình của tôi phản hồi. – DxCK