Mouse wheel scrolling Toolstrip menu items

后端 未结 4 1365
梦如初夏
梦如初夏 2021-01-14 13:48

I have some menus that contain many menuitems. Mouse wheel doesn\'t scroll them. I have to use the keyboard arrows or click the arrows at top and bottom. Is it possible to u

4条回答
  •  隐瞒了意图╮
    2021-01-14 14:02

    A working solution:

    1. Register for MouseWheel event of your form and DropDownClosed event of your root MenuStripItem (here, rootItem) in the Load event of the form

          this.MouseWheel += Form3_MouseWheel;
          rootItem.DropDownOpened += rootItem_DropDownOpened;
          rootItem.DropDownClosed += rootItem_DropDownClosed;
      
    2. Add the code for Keyboard class which simulate key presses

      public static class Keyboard
      {
          [DllImport("user32.dll")]
          static extern uint keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);
      
      
          const byte VK_UP = 0x26; // Arrow Up key
          const byte VK_DOWN = 0x28; // Arrow Down key
      
          const int KEYEVENTF_EXTENDEDKEY = 0x0001; //Key down flag, the key is going to be pressed
          const int KEYEVENTF_KEYUP = 0x0002; //Key up flag, the key is going to be released
      
          public static void KeyDown()
          {
              keybd_event(VK_DOWN, 0, KEYEVENTF_EXTENDEDKEY, 0);
              keybd_event(VK_DOWN, 0, KEYEVENTF_KEYUP, 0);
          }
      
          public static void KeyUp()
          {
              keybd_event(VK_UP, 0, KEYEVENTF_EXTENDEDKEY, 0);
              keybd_event(VK_UP, 0, KEYEVENTF_KEYUP, 0);
          }
      }
      
    3. Add the code for DropDownOpened, DropDownClosed, MouseWheel events:

      bool IsMenuStripOpen  = false;
      
      void rootItem_DropDownOpened(object sender, EventArgs e)
      {
          IsMenuStripOpen = true;
      }
      
      
      void rootItem_DropDownClosed(object sender, EventArgs e)
      {
          IsMenuStripOpen = false;
      }
      
      void Form3_MouseWheel(object sender, MouseEventArgs e)
      {
          if (IsMenuStripOpen)
          {
              if (e.Delta > 0)
              {
                  Keyboard.KeyUp();
              }
              else
              {
                  Keyboard.KeyDown();
              }
          }
      }
      

提交回复
热议问题