xjsxjs197 发表于 2014-11-11 16:16:00

如果屏蔽PlusPak中TabControl的Ctrl + Tab处理

以前问过相同的问题,当时是在PreviewKeyDown事件中判断屏蔽的,当时是没有问题的。

但是,控件升级到File Version : 7.0.2014.0423后,就有问题了:
当焦点在TabControl上时,按Ctrl + Tab,自然会走PreviewKeyDown事件,我可以捕捉到,并相应处理;
如果焦点不在TabControl上,而是在TabControl的TabPage中的某一输入框,按Ctrl + Tab,就不会走PreviewKeyDown事件,但还是自动切换Tab了!最理解不了的是,父页面的PreviewKeyDown事件也不走了。

这的确很智能,在绝大多数场合都适用,但是肯定还会有特殊情况的,请问有办法在TabControl不获得焦点时,按Ctrl + Tab,先做我的处理,后做控件内部处理吗?

补充:我暂时可以在TabSelecting事件中判断,如果当前TabControl没有获得焦点,就取消,不过感觉这是使用一种打补丁的方法来绕这个问题,希望能有更简单一点的方式。

Leo 发表于 2014-11-11 17:51:00

如果焦点不在TabControl上,而是在TabControl的TabPage中的某一输入框,按Ctrl + Tab,就不会走PreviewKeyDown事件,但还是自动切换Tab了!
这个行为,在6.0版本被Log为HotFix的Bug,并且已经被修复
修复之后导致的一个副作用就是像你看到的,父页面无法收到PreviewKeyDown了。我觉得这个可能是一个问题。在后续版本中可以考虑修复一下。

关于目前的版本,有一个神器叫做GcGlobalHook,专治各种疑难杂症。参考以下Code:

// EnableKeyBoardHook先
this.gcGlobalHook.EnableKeyboardHook = true;

private void gcGlobalHook1_KeyDown(object sender, KeyEventArgs e)
      {
            if (e.KeyData == (Keys.Control | Keys.Tab) ||
                e.KeyData == (Keys.Control | Keys.Shift | Keys.Tab))
            {
                System.Diagnostics.Debug.WriteLine("Ctrl+Tab");
                if (this.gcTabControl1.ContainsFocus)
                {
                  e.Handled = true;
                }
            }
      }

xjsxjs197 发表于 2014-11-12 14:42:00

非常感谢!果然是神器!!!

Alice 发表于 2014-11-12 17:32:00

回复 3楼xjsxjs197的帖子

此贴完结。
如果有新问题欢迎开新帖。
http://gcdn.gcpowertools.com.cn/attachment.aspx?attachmentid=10062
页: [1]
查看完整版本: 如果屏蔽PlusPak中TabControl的Ctrl + Tab处理