private void TrackDropDown(int index) { while (index >= 0) { this.trackNextItem = -1; this.BeginUpdate(); CommandBarMenu menu = this.items[index] as CommandBarMenu; if (menu != null) { menu.PerformDropDown(EventArgs.Empty); this.contextMenu.Items.Clear(); this.contextMenu.Items.AddRange(menu.Items); // = menu.Items; this.contextMenu.Mnemonics = true; } else { this.contextMenu.Items.Clear(); // .Items = new CommandBarItemCollection(); this.contextMenu.Mnemonics = true; } // Item state NativeMethods.SendMessage(this.Handle, NativeMethods.TB_PRESSBUTTON, index, -1); // Trick to get the first menu item selected NativeMethods.PostMessage(this.Handle, NativeMethods.WM_KEYDOWN, (int)Keys.Down, 1); NativeMethods.PostMessage(this.Handle, NativeMethods.WM_KEYUP, (int)Keys.Down, 1); this.SetState(State.HotTracking, index); // Hook NativeMethods.HookProc hookProc = new NativeMethods.HookProc(DropDownHook); GCHandle hookProcHandle = GCHandle.Alloc(hookProc); this.hookHandle = NativeMethods.SetWindowsHookEx(NativeMethods.WH_MSGFILTER, hookProc, IntPtr.Zero, NativeMethods.GetCurrentThreadId()); if (this.hookHandle == IntPtr.Zero) { throw new SecurityException(); } // Ask for position NativeMethods.RECT rect = new NativeMethods.RECT(); NativeMethods.SendMessage(Handle, NativeMethods.TB_GETRECT, index, ref rect); Point position = new Point(rect.left, rect.bottom); this.EndUpdate(); this.Update(); this.contextMenu.Show(this, position); // Unhook NativeMethods.UnhookWindowsHookEx(hookHandle); hookProcHandle.Free(); this.hookHandle = IntPtr.Zero; // Item state NativeMethods.SendMessage(Handle, NativeMethods.TB_PRESSBUTTON, index, 0); this.SetState(trackEscapePressed ? State.Hot : State.None, index); index = trackNextItem; } }