如何解决将组合键严格地绑定到特定表单
能否请您告诉我如何使用“globalmousekeyhook”库 (https://github.com/gmamaladze/globalmousekeyhook/blob/vNext/keycomb.md) 编写键盘快捷键不是针对整个应用程序,而是针对特定表单?为了避免每次都检查表单的活动(Form.ActiveForm == this)。 附注如果不进行这些检查,键盘快捷键将在所有创建的表单中同时触发。
private void Form1_Load(object sender,EventArgs e) {
Action ex1 = () => { if (Form.ActiveForm == this) Dop.ChangeBackColor(this,Color.Black); };
Action ex2 = () => { if (Form.ActiveForm == this) Dop.ChangeBackColor(this,Color.Green); };
// Install listener App [Combinations]
Hook.AppEvents().OnCombination(new Dictionary<Combination,Action> {
{ Combination.FromString("Control + S"),ex1 },{ Combination.FromString("Control + D"),ex2 }
});
}
解决方法
AppEvents 的解决方案
map
GlobalEvents 的解决方案(如果您的应用程序中只有 1 个表单)
在 FormName_Load 中激活 GlobalEvents
private IKeyboardMouseEvents m_ApplHook;
private void FormName_Activated(object sender,EventArgs e) {
m_ApplHook = Hook.AppEvents(); // Subscribe
Action d = () => { Dop.ChangeBackColor(this,Color.Black); };
Action s = () => { Dop.ChangeBackColor(this,Color.Red); };
// Install listener App [Combinations]
m_ApplHook.OnCombination(new Dictionary<Combination,Action> {
{ Combination.FromString("Control + S"),d },{ Combination.FromString("Control + D"),s }
});
}
private void FormName_Deactivate(object sender,EventArgs e) {
m_ApplHook.Dispose(); // UnSubscribe
}
在 FormName_Closed 中停用 GlobalEvents(非强制性:关闭主表单将关闭整个应用程序
private IKeyboardMouseEvents m_GlobalHook;
private void FormName_Load(object sender,EventArgs e) {
m_GlobalHook = Hook.GlobalEvents();
// Install Global listener [Sequences]
Sequence OpenApps = Sequence.FromString("Control + C,Control + C");
Dictionary<Sequence,Action> assignments = new Dictionary<Sequence,Action> {
{ OpenApps,() => {
this.Text = Clipboard.GetText();
}},};
// Replace Hook.GlobalEvents() on m_GlobalHook
m_GlobalHook.OnSequence(assignments);
}
GlobalEvents 的解决方案(如果您的应用程序中有 1 个以上的表单)
使用 Hide() 隐藏所需的表单,打开另一个表单。根据这本书 (http://it-kniga.narod.ru/5-7502-0222-4/02020903.html),方法 Hide() 类似于 Visible = false;
创建 FormName_VisibleChanged 事件。以所有必要的形式编写代码(例如:FormMain、Form1、FormName...)。此方法允许您为每个单独的表单而不是所有正在运行的(隐藏的)表单激活 GlobalEvents。
private void FormName_FormClosed(object sender,FormClosedEventArgs e) {
m_GlobalHook.Dispose();
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。