发布:2021/10/26 13:56:27作者:管理员 来源:本站 浏览次数:948
不建议把左右方向键都用来切换焦点,否则你在TextBox里面改变光标所在字符位置就不方便了。
方法一:笨方法,需为每个控件单独注册事件处理
以TextBox为例,代码如下:
- private void textbox_KeyDown(object sender, KeyEventArgs e)
- {
- if (e.KeyCode == Keys.Down || e.KeyCode == Keys.Enter)
- {
- e.SuppressKeyPress = true;
- System.Windows.Forms.SendKeys.Send("{Tab}");
- }
- else if (e.KeyCode == Keys.Up)
- {
- e.SuppressKeyPress = true;
- System.Windows.Forms.SendKeys.Send("+{Tab}");
- }
- }
方法二:简单方法,无需为每个控件单独注册事件处理,仅需在窗体类上加入如下代码:
- //上、下方向键,及回车键切换控件焦点
- protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
- {
- Keys key = (keyData & Keys.KeyCode);
- if (e.KeyCode == Keys.Down || e.KeyCode == Keys.Enter)
- {
- System.Windows.Forms.SendKeys.Send("{Tab}");
- return true;
- }
- else if (e.KeyCode == Keys.Up)
- {
- System.Windows.Forms.SendKeys.Send("+{Tab}");
- return true;
- }
- return base.ProcessCmdKey(ref msg, keyData);
- }
到此,切换控件焦点的功能已实现,现在有个新的需求,窗体界面上有两个ComboBox控件cmbMeas和cmbRemark,我希望在这两个控件上Enter回车时提交,而不是切换焦点,那怎么办呢?那就需要判断当前拥有焦点的控件是不是cmbMeas或cmbRemark,上面的代码需要稍微改动下,具体代码如下:
- //API声明:获取当前焦点控件句柄
- [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Winapi)]
- internal static extern IntPtr GetFocus();
- //获取当前拥有焦点的控件
- private Control GetFocusedControl()
- {
- Control focusedControl = null;
- // To get hold of the focused control:
- IntPtr focusedHandle = GetFocus();
- if (focusedHandle != IntPtr.Zero)
- //focusedControl = Control.FromHandle(focusedHandle);
- focusedControl = Control.FromChildHandle(focusedHandle);
- return focusedControl ;
- }
- protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
- {
- Keys key = (keyData & Keys.KeyCode);
- Control ctrl = GetFocusedControl();
- if (e.KeyCode == Keys.Down || (key == Keys.Enter && ctrl.Name != "cmbMeas" && ctrl.Name != "cmbRemark"))
- {
- System.Windows.Forms.SendKeys.Send("{Tab}");
- return true;
- }
- else if (e.KeyCode == Keys.Up)
- {
- System.Windows.Forms.SendKeys.Send("+{Tab}");
- return true;
- }
- return base.ProcessCmdKey(ref msg, keyData);
- }
说明:
Control.FromHandle 方法
返回当前与指定句柄关联的控件;如果找不到带有指定句柄的控件,就返回空引用。
Control.FromChildHandle 方法
如果需要返回拥有多个句柄的控件,应使用 FromChildHandle 方法。
此方法沿着窗口句柄父级链向上搜索,直到找到与控件关联的句柄。此方法比 FromHandle 方法更可靠,因为它正确返回拥有多个句柄的控件。
对于用户自定义控件,应当使用FromChildHandle 方法。
© Copyright 2014 - 2024 柏港建站平台 ejk5.com. 渝ICP备16000791号-4