本帖最後由 Charcoal99 於 2016-9-8 23:00 編輯
有關F10的問題, 你可以在離開 TextBox1_KeyDown 時加一句 e.Handled = Ture
通知系統不要再處理這鍵。 若有其他 HotKey 要系統處理, 也可先檢查是 F10 才加這一句。
https://msdn.microsoft.com/en-us/library/system.windows.forms.keypresseventargs.handled(v=vs.110).aspx
至於要分判 main Return 跟 numPad Return 會稍麻煩點,
這不同行為跟 DotNET 版本有關, 你所看的是 Visual Studio 6.0 的行為。
後來的 Windows Form Framework 是特意要把它們看成是一樣的,
要從更底層去攔截及處理 Windows Message.
如要截取 TextBox 的Key, 方法是 subclass TextBox class 然後 override 裡面的 WndProc() ,
截取 WM_KEYDOWN 及 WParam = 13 的 Message, 然後檢查
bit 24 的 Extended-Key Flag,
https://msdn.microsoft.com/en-us/library/windows/desktop/ms646267(v=vs.85).aspx
Form 裡面的 TextBox 要由新的 subclass 手動產生。 C# 的Code 大致如此 :- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows.Forms;
- namespace TestKey {
- class MyTextBox : TextBox {
- protected override void WndProc(ref Message m) {
- // WM_KEYDOWN == 256, Enter == 13
- if (m.Msg == 256 && m.WParam.ToInt32() == 13) {
- Console.WriteLine("{0:X}", m.LParam.ToInt32());
- if ((m.LParam.ToInt32() & 0x01000000) == 0) {
- Console.WriteLine("main Enter");
- } else {
- Console.WriteLine("numpad Enter");
- }
- } else {
- base.WndProc(ref m);
- }
- }
- }
- public partial class Form1 : Form {
- public Form1() {
- InitializeComponent();
- // 程式產生的 textBox
- MyTextBox tb1 = new MyTextBox();
- tb1.Name = "Test";
- tb1.Text = "MyTextBox";
- tb1.Location = new Point(40, 120);
- tb1.Visible = true;
- this.Controls.Add(tb1);
- }
- // Form Design 的 textBox
- private void textBox1_KeyDown(object sender, KeyEventArgs e) {
- label1.Text = e.KeyCode + "," + e.KeyData + "," + e.KeyValue;
- e.Handled = true;
- }
- }
- }
複製代碼 |