C#如何停止全局热键重复操作?

时间:2015-08-10 19:26:49

标签: c# winforms loops global-hotkey

问题是,当我按下一个全局热键组合(ctrl + space)并按住按钮一秒钟时,程序会循环它并显示大量相同的文本,如:

"一些文字" "更多文字" "一些文字" "更多文字" "一些文字" "更多文字"

让我们说用户已经老了,无法快速释放键盘按钮。如何使程序执行此全局热键操作ONCE? (即使按下热键一段时间)。 我试过了(uint)fsModifiers.Control | (uint)fsModifiers.Norepeat但没有效果。 提前谢谢!

protected override void WndProc(ref Message keyPressed)
        {
            if (keyPressed.Msg == 0x0312)
            {
                    System.Threading.Thread.Sleep(300);
                    System.Windows.Forms.SendKeys.Send("some text");
                    System.Threading.Thread.Sleep(500);
                    System.Windows.Forms.SendKeys.Send("{TAB}");
                    System.Threading.Thread.Sleep(500);
                    System.Windows.Forms.SendKeys.Send("{TAB}");
                    System.Threading.Thread.Sleep(500);
                    System.Windows.Forms.SendKeys.Send("some more text");
                    MessageBox.Show("DONE", "DONE", MessageBoxButtons.OK, MessageBoxIcon.Information);       
            }
            base.WndProc(ref keyPressed);
        }

    private void Form1_Load(object sender, EventArgs e)
    {
        RegisterHotKey(this.Handle, 1, (uint)fsModifiers.Control , (uint)Keys.Space);
    }

 public enum fsModifiers
        {
            Alt = 0x0001,
            Control = 0x0002,
            Shift = 0x0004,
            Window = 0x0008,
            Norepeat = 0x4000,
        }

1 个答案:

答案 0 :(得分:0)

用C ++编写,我不知道C#,但代码显示了问题的可能解决方案。

Alt + F2的解决方案。

OrderedDict([('3', {'stav': '+', 'name': 'cola', 'weight': '3', 'url': 'goo.gl/2BgLmm', 'time_exp': datetime.datetime(2017, 11, 17, 23, 37, 31, 946000), '_id': ObjectId('5a13a8c396fb3488bb6a0648')}), ('2', {'stav': '+', 'name': 'cola', 'weight': '2', 'url': 'goo.gl/2BgLmm', 'time_exp': datetime.datetime(2017, 11, 17, 23, 37, 31, 946000), '_id': ObjectId('5a13a8ca96fb3488bb6a0649')})])

...

主:

   static bool locked=false; 
   switch(uMsg)
   {
      case WM_HOTKEY:
      {
         if(wParam==ANY_IDENTIFIER_OF_HOTKEY && !locked)
         {
            if(windows < WINDOWS7)
            {
               locked=true;
               SetTimer(hwnd,0x665,40,NULL); 
            } 
            doAnyAction();
         }
         return 0;
      }
      case WM_TIMER:
      {
         if(wParam==0x665)
         { 
            if(!(GetAsyncKeyState(VK_F2)&0x8000)) // detected key-up
            {
               locked=false;
               KillTimer(hwnd, 0x665);
            }
         }
         return 0;
      }
      ...
   }

更新说这是不可能的。它对我有用。