0

問題は、グローバル ホットキーの組み合わせ (ctrl + スペース) を押してボタンを 1 秒間押し続けると、プログラムがループして、次のような同じテキストがたくさん表示されることです。

「いくつかのテキスト」「いくつかのテキスト」「いくつかのテキスト」「いくつかのテキスト」「いくつかのテキスト」「いくつかのテキスト」

ユーザーが年をとっていて、キーボードのボタンをすばやく離すことができないとしましょう。プログラムにこのグローバル ホットキー アクションを 1 回実行させるにはどうすればよいですか? (ホットキーがしばらく押されていても)。試し(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,
        }
4

1 に答える 1

1

C++ で書かれており、C# はわかりませんが、コードは問題の可能な解決策を示しています。

Alt+F2 のソリューション。

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

...

主要:

   if(windows>=WINDOWS7)
      RegisterHotKey(hwnd,ANY_IDENTIFIER_OF_HOTKEY,MOD_ALT|0x4000,VK_F2);
   else
      RegisterHotKey(hwnd,ANY_IDENTIFIER_OF_HOTKEY,MOD_ALT,VK_F2);

新しい人はそれは不可能だと言います。わたしにはできる。

于 2017-11-23T03:15:19.573 に答える