简体   繁体   English

将组合键(严格)绑定到特定表单

[英]Binding key combinations (strictly) to a specific form

Could you please tell me how to use the "globalmousekeyhook" library ( https://github.com/gmamaladze/globalmousekeyhook/blob/vNext/keycomb.md ) to write keyboard shortcuts Not to the whole application, but to a specific form ?您能否告诉我如何使用“globalmousekeyhook”库( https://github.com/gmamaladze/globalmousekeyhook/blob/vNext/keycomb.md )来编写键盘快捷键不是针对整个应用程序,而是针对特定表单 To avoid checking the form for activity, every time (Form.ActiveForm == this).为了避免每次都检查表单的活动(Form.ActiveForm == this)。 PS If you do not do these checks, the keyboard shortcuts, will be triggered simultaneously in all created forms. PS 如果您不进行这些检查,键盘快捷键将在所有创建的 forms 中同时触发。

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 }
   });
}

Solution for AppEvents应用事件解决方案

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
}

Solution for GlobalEvents (If you have only 1 form in your application) GlobalEvents 的解决方案(如果您的应用程序中只有 1 个表单)

Activate GlobalEvents in FormName_Load在 FormName_Load 中激活 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);
}

Deactivate GlobalEvents in FormName_Closed (Not obligatory: closing the main form will close the entire application停用 FormName_Closed 中的 GlobalEvents(非强制性:关闭主窗体将关闭整个应用程序

private void FormName_FormClosed(object sender, FormClosedEventArgs e) {
  m_GlobalHook.Dispose();
}

Solution for GlobalEvents (If you have more than 1 form in your application) GlobalEvents 的解决方案(如果您的应用程序中有超过 1 个表单)

Hide the desired form using Hide(), open another one.使用 Hide() 隐藏所需的表单,打开另一个表单。 According to the book ( http://it-kniga.narod.ru/5-7502-0222-4/02020903.html ), method Hide() is analogous to Visible = false;根据书( http://it-kniga.narod.ru/5-7502-0222-4/02020903.html ),方法 Hide() 类似于 Visible = false;

Create the FormName_VisibleChanged event.创建 FormName_VisibleChanged 事件。 Write the code in all the necessary forms (example: FormMain, Form1, FormName...).在所有必要的 forms 中编写代码(例如:FormMain、Form1、FormName...)。 This method allows you to activate GlobalEvents for each individual form instead of all running (hidden) forms.此方法允许您为每个单独的表单激活 GlobalEvents,而不是所有正在运行(隐藏)的 forms。

private IKeyboardMouseEvents m_GlobalHook;
// Documentation: https://github.com/gmamaladze/globalmousekeyhook/blob/vNext/keycomb.md

private void FormName_VisibleChanged(object sender, EventArgs e) {
  if (this.Visible) {
    m_GlobalHook = Hook.GlobalEvents(); // Subscribe

    Action ex = () => { this.Text += "Ctrl + C x2"; };
    Action ext = () => { this.Text += "Shift + C"; };

    // Install Global listener [Sequences]
    m_GlobalHook.OnSequence(new Dictionary<Sequence, Action> {
      { Sequence.FromString("Control + C, Control + C"), ex },
      { Sequence.FromString("Shift + C"), ext },
    });

  } else m_GlobalHook.Dispose(); // UnSubscribe
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM