环境:界面上有textbox,combobox等控件。
不建议把左右方向键都用来切换焦点,否则你在textbox里面改变光标所在字符位置就不方便了。
方法一:笨方法,需为每个控件单独注册事件处理
以textbox为例,代码如下:
1 private void textbox_keydown(object sender, keyeventargs e)
2 {
3 if (e.keycode == keys.down || e.keycode == keys.enter)
4 {
5 e.suppresskeypress = true;
6 system.windows.forms.sendkeys.send({tab});
7 }
8 else if (e.keycode == keys.up)
9 {
10 e.suppresskeypress = true;
11 system.windows.forms.sendkeys.send(+{tab});
12 }
13 }
方法二:简单方法,无需为每个控件单独注册事件处理,仅需在窗体类上加入如下代码:
1 //上、下方向键,及回车键切换控件焦点 2 protected override bool processcmdkey(ref message msg, keys keydata) 3 { 4 keys key = (keydata & keys.keycode); 5 if (e.keycode == keys.down || e.keycode == keys.enter)
6 {
7 system.windows.forms.sendkeys.send({tab});
8 return true;
9 }
10 else if (e.keycode == keys.up)
11 {
12 system.windows.forms.sendkeys.send(+{tab});13 return true;
14 }
15 return base.processcmdkey(ref msg, keydata);16 }
到此,切换控件焦点的功能已实现,现在有个新的需求,窗体界面上有两个combobox控件cmbmeas和cmbremark,我希望在这两个控件上enter回车时提交,而不是切换焦点,那怎么办呢?那就需要判断当前拥有焦点的控件是不是cmbmeas或cmbremark,上面的代码需要稍微改动下,具体代码如下:
1 //api声明:获取当前焦点控件句柄 2 [dllimport(user32.dll, charset = charset.auto, callingconvention = callingconvention.winapi)] 3 internal static extern intptr getfocus(); 4 5 //获取当前拥有焦点的控件 6 private control getfocusedcontrol() 7 { 8 control focusedcontrol = null; 9 // to get hold of the focused control:10 intptr focusedhandle = getfocus();11 if (focusedhandle != intptr.zero)12 //focusedcontrol = control.fromhandle(focusedhandle);13 focusedcontrol = control.fromchildhandle(focusedhandle);14 return focusedcontrol ;15 }16 17 protected override bool processcmdkey(ref message msg, keys keydata)18 {19 keys key = (keydata & keys.keycode);20 control ctrl = getfocusedcontrol();21 if (e.keycode == keys.down || (key == keys.enter && ctrl.name != cmbmeas && ctrl.name != cmbremark))
22 {
23 system.windows.forms.sendkeys.send({tab});
24 return true;
25 }
26 else if (e.keycode == keys.up)
27 {
28 system.windows.forms.sendkeys.send(+{tab});29 return true;
30 }
31 return base.processcmdkey(ref msg, keydata);32 }
说明:
control.fromhandle 方法
返回当前与指定句柄关联的控件;如果找不到带有指定句柄的控件,就返回空引用。
control.fromchildhandle 方法
如果需要返回拥有多个句柄的控件,应使用 fromchildhandle 方法。
此方法沿着窗口句柄父级链向上搜索,直到找到与控件关联的句柄。此方法比 fromhandle 方法更可靠,因为它正确返回拥有多个句柄的控件。
对于用户自定义控件,应当使用fromchildhandle 方法。
以上就是c#中方向键与回车键切换控件焦点的两种方法的详细内容。