2009-10-30 41 views
10

Mặc dù tôi làm việc với C# (Windows Forms) trong nhiều năm, tôi đang gặp phải một khoảnh khắc không thành công và không thể cho tôi biết cách bắt người dùng gõ Ctrl + C vào hộp văn bản.Chụp Ctrl + C trong hộp văn bản

Ứng dụng của tôi về cơ bản là một ứng dụng thiết bị đầu cuối, và tôi muốn Ctrl +C để gửi một (byte)3 đến một cổng nối tiếp, chứ không phải là phím tắt cho Copy to Clipboard.

Tôi đã đặt các phím tắt enabled thuộc tính thành sai trên hộp văn bản. Tuy nhiên, khi người dùng truy cập Ctrl + C, sự kiện nhấn phím không kích hoạt.

Nếu tôi bắt KeyDown, sự kiện cháy khi người dùng nhấn Ctrl (có nghĩa là, trước khi họ nhấn C key).

Nó có thể là một cái gì đó ngu ngốc đơn giản mà tôi đang thiếu.

Trả lời

32

Đi trước và sử dụng các sự kiện KeyDown, nhưng trong đó kiểm tra sự kiện cho cảCtrlC, như vậy:

if (e.Control && e.KeyCode == Keys.C) { 
    //... 
    e.SuppressKeyPress = true; 
} 

Ngoài ra, để ngăn chặn xử lý các tổ hợp phím của TextBox cơ bản , đặt thuộc tính SuppressKeyPress thành true như được hiển thị.

+0

Được chấp nhận vì nó là câu trả lời đầu tiên làm việc. Cảm ơn nhiều. - Cuối cùng tôi đã tìm ra nó - xem câu trả lời của riêng tôi. – Bryan

+0

Tôi biết, đã lâu rồi, nhưng đối với những người sẽ tìm thấy điều này trong tương lai: Shift-Insert vẫn được xử lý, vì vậy bạn cần thêm xác nhận (e.Shift && e.KeyCode == Keys.Insert). Ngoài ra người dùng vẫn có thể nhấp chuột phải vào trường và chọn Dán ... Vì vậy, không phải bằng chứng 100%. – trailmax

1

Hãy thử cách sau: chụp mũi tên lênmũi tên xuống sự kiện. Khi bạn phát hiện mũi tên xuống cho CTRL, hãy đặt cờ; khi bạn phát hiện mũi tên lên, hãy đặt lại cờ. Nếu bạn phát hiện phím C trong khi cờ được đặt, bạn có Ctrl + C.

Chỉnh sửa. Ouch ... Câu trả lời của Jay chắc chắn là tốt hơn. :-)

6

sự kiện chính xảy ra theo trình tự sau:

  1. KeyDown
  2. KeyPress
  3. KeyUp

Sự kiện KeyPress không được đưa lên bởi các phím noncharacter; tuy nhiên, các phím noncharacter làm tăng các sự kiện KeyDown và KeyUp. Điều khiển là một khóa phi tuyến.

Bạn có thể kiểm tra với dòng mã: if (e.KeyData == (Keys.Control | Keys.C))

3

D'oh! Chỉ cần tìm ra. Trong số ba sự kiện có thể xảy ra, cái mà tôi chưa thử là thứ tôi cần!Sự kiện KeyUp là quan trọng nhất:

private void txtConsole_KeyUp(object sender, KeyEventArgs e) 
{ 
    if (e.KeyData == (Keys.C | Keys.Control)) 
    { 
     _consolePort.Write(new byte[] { 3 }, 0, 1); 
     e.Handled = true; 
    } 
} 
+1

Vâng, tất cả các bạn đánh tôi với nó. KeyDown không làm việc cho tôi, vì tôi đã sử dụng điểm break để bắt các sự kiện. Tuy nhiên, nó hoạt động tốt trên KeyUp, vì thế tại sao tôi lại quyết định về sự kiện này. – Bryan

5

Tôi đã có một vấn đề bắt Ctrl +C trên TextBox bởi KeyDown. Tôi chỉ nhận được Control khi cả hai ControlC được nhấn. Các giải pháp được sử dụng PreviewKeyDown:

private void OnLoad() 
{ 
    textBox.PreviewKeyDown += OnPreviewKeyDown; 
    textBox.KeyDown += OnKeyDown; 
} 

private void OnPreviewKeyDown(object sender, PreviewKeyDownEventArgs e) 
{ 
    if (e.Control) 
    { 
     e.IsInputKey = true; 
    } 
} 

private void OnKeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.Control && e.KeyCode == Keys.C) { 
     textBox.Copy(); 
    } 
} 
+0

Không đúng sự thật, KeyUp bắt sự kiện là giải pháp đúng. – TarmoPikaro

1

Tôi không biết nếu đó là vì một số thay đổi trong phiên bản mới hơn hoặc bởi vì tôi đang cố gắng sử dụng này trên ListBox, nhưng không có e.Control trong KeyEventArgs e mà tôi nhận được từ KeyDown.

tôi đã phải làm việc xung quanh giải pháp, tôi đã đưa ra với điều này (nó không phải là đẹp nhất, nhưng nó hoạt động tốt):

private List<Key> KeyBuff = new List<Key>(); 

private void ListBox_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (!KeyBuff.Exists(k => k == e.Key)) 
     KeyBuff.Add(e.Key); 

    if (KeyBuff.Exists(k => k == Key.LeftCtrl || k == Key.RightCtrl) && 
     KeyBuff.Exists(k => k == Key.C)) 
    { 
     // Desired detection 
     Clipboard.SetText(SelectedText); 
    } 
} 

private void ListBox_KeyUp(object sender, KeyEventArgs e) 
{ 
    KeyBuff.Clear(); 
} 
Các vấn đề liên quan