Ну, в итоге я нашел свое собственное решение, которое было довольно простым.Я получаю свой собственный класс ToolStrip (и класс MenuStrip) следующим образом:
// This version of ToolStrip enables mouse click's even when the main form is NOT active.
private class MyToolStrip : ToolStrip
{
const uint WM_LBUTTONDOWN = 0x201;
const uint WM_LBUTTONUP = 0x202;
static private bool down = false;
protected override void WndProc(ref Message m)
{
if (m.Msg==WM_LBUTTONUP && !down) {
m.Msg=(int)WM_LBUTTONDOWN; base.WndProc(ref m);
m.Msg=(int)WM_LBUTTONUP;
}
if (m.Msg==WM_LBUTTONDOWN) down=true;
if (m.Msg==WM_LBUTTONUP) down=false;
base.WndProc(ref m);
}
}
Похоже, что, как и в Mac OS X, Windows приняла решение в стиле GUI, для которого требуется сначала активировать окно ДОэто позволит выбрать любые элементы управления.Однако Windows делает это только для определенных элементов управления, таких как ToolStrip и MenuStrip.Когда ваше окно НЕ активно, эти элементы управления не отправляют событие мыши ВНИЗ.Я не уверен, как WinForms применяет эту рекомендацию по GUI, но, возможно, он использует фильтр сообщений, используя Application.AddMessageFilter ().
Независимо от того, элементы управления MenuStrip по-прежнему получать событие мыши UPИ это вдохновило мое решение.Я просто ищу любое событие мыши UP, в котором отсутствует соответствующее событие DOWN.Когда я вижу этот специфический случай, я генерирую свое собственное событие мыши DOWN, и для элементов управления ToolStrip весь мир счастлив.: -)