2009-06-19 28 views
11

Tôi cần chụp sự kiện KeyUp trong biểu mẫu của mình (để chuyển đổi "chế độ toàn màn hình"). Dưới đây là những gì tôi đang thực hiện:Ghi lại sự kiện KeyUp trên biểu mẫu khi điều khiển con đã tập trung

protected override void OnKeyUp(KeyEventArgs e) 
{ 
    base.OnKeyUp(e); 

    if (e.KeyCode == Keys.F12) this.ToggleFullScreen(); 
} 

private void ToggleFullScreen() 
{ 
    // Snazzy code goes here   
} 

Điều này làm việc tốt, trừ khi kiểm soát biểu mẫu đã tập trung. Trong trường hợp đó, tôi không nhận được sự kiện nào cả (cũng đã thử OnKeyDown - không có may mắn ở đó).

Tôi có thể xử lý sự kiện KeyUp từ điều khiển con, nhưng các điều khiển trên biểu mẫu được tạo động và có thể có nhiều người trong số họ - mỗi người có nhiều con riêng.

Có cách nào để thực hiện việc này mà không tạo trình xử lý sự kiện cho mọi điều khiển trên màn hình (mà tôi chắc chắn có thể thực hiện với chức năng đệ quy) không?

Trả lời

12

Đặt KeyPreview của biểu mẫu thành true và bạn có thể chặn sự kiện KeyUp.

Trong ứng dụng thử nghiệm của tôi, tôi đã làm một cái gì đó như thế này:

this.KeyPreview = true; 
. 
. 
. 


private void button1_KeyUp(object sender, KeyEventArgs e) 
{ 
    Trace.WriteLine("button key up"); 
} 

private void Form1_KeyUp(object sender, KeyEventArgs e) 
{ 
    Trace.WriteLine("form key up"); 
    e.Handled = true; 
} 

Nó sẽ đổ dưới dạng dấu vết dòng, xử lý chìa khóa lên và xử lý nút sẽ không được gọi. Bạn có thể, tất nhiên, không xử lý các sự kiện (không làm e.Handled = true) và sau đó xử lý nút sẽ được gọi là quá.

+0

Ngắn và ngọt. Tôi thích nó! – Joseph

+0

Chỉ là những gì tôi cần! Cảm ơn bạn! –

5

Bạn đã thử xử lý các sự kiện trên toàn cầu trên biểu mẫu của mình chưa?

protected override bool ProcessCmdKey(ref Message msg, Keys e) 
{ 
    if (e.KeyCode == Keys.F12) 
    { 
     this.ToggleFullScreen(); 
     return true; //marks command as handled 
    } 

    return base.ProcessCmdKey(ref msg, e); // Resend To Base Function 
} 
+0

Điều này cũng hoạt động, cảm ơn. –

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