2010-08-06 13 views
11

La mia applicazione è un'applicazione C# Windows Form e .Net in qualche modo rende il comportamento predefinito della mia barra dei menu principale e dei pulsanti della barra degli strumenti che devi prima fare clic sulla finestra della mia app (ovunque), prima di farti fare clic menu o pulsante della striscia degli strumenti. Come posso cambiare questo?Windows richiede un clic per attivare una finestra prima che un secondo clic selezioni un pulsante. Come posso cambiare questo?

Le vecchie app come Blocco note e WordPad non si comportano in questo modo. Ma tutte le app di Microsoft Office lo fanno. Ma questo è così fastidioso!

La situazione peggiora perché la mia app apre finestre secondarie e ogni volta che cambio finestra, devo prima attivare la finestra danneggiata prima di poter fare qualsiasi cosa. Ugh!

Spero ci sia un modo globale per modificare questo comportamento, quindi non devo sovrascrivere molti controlli singolarmente (non l'ho provato). Qualcuno lo sa?

Nota che i controlli sulle finestre di dialogo della mia app non mostrano questo comportamento stupido. Perché sono diversi?

+0

Sembra come utilizzare qualsiasi programma in Mac OS X. – Guttsy

risposta

13

Bene, ho finito per trovare la mia soluzione che è piuttosto semplice. Derivo la mia stessa classe ToolStrip (e la classe MenuStrip) come segue:

// 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); 
    } 
} 

Sembra che, proprio come il Mac OS X, Windows ha preso una decisione stile di interfaccia grafica che si richiede di attivare prima una finestra prima che possa consentire qualsiasi controllo da selezionare. Tuttavia, Windows lo fa solo per controlli specifici, come ToolStrip e MenuStrip. Quando la tua finestra NON è attiva, questi controlli non vengono inviati all'evento DOWN del mouse. Non sono sicuro di come WinForms applichi questa linea guida GUI, ma forse utilizza un filtro messaggi usando Application.AddMessageFilter().

Indipendentemente da ciò, i controlli MenuStrip STILL ottengono l'evento mouse UP. E questo ha ispirato la mia soluzione. Cerco semplicemente qualsiasi evento di mouse UP a cui manca il corrispondente evento DOWN. Quando vedo questo caso particolare, generi il mio evento DOWN del mouse e, per i controlli ToolStrip, il mondo è tutto felice. :-)

+0

ho provato questo e funziona benissimo. Anche questo mi ha infastidito per un po '. –

+0

Anch'io trovo questo comportamento davvero fastidioso e incoerente. C'è qualche soluzione per i controlli di Office integrati? –

+1

Grazie AZDean. Mi hai salvato la giornata. –

-1

È possibile rilevare il clic sul modulo anche quando l'applicazione non è attiva se si sottoscrive l'evento MouseClick.

Quindi, quando si fa clic sul modulo, si otterrà la richiamata indipendentemente dal fatto che il modulo abbia precedentemente messo a fuoco o meno.

Quindi è possibile simulare il clic sul controllo desiderato.

Questa non è una soluzione terribilmente elegante, ma dovrebbe funzionare. Devi assicurarti che il clic non venga inviato due volte sul pulsante della barra degli strumenti.

0

Questa sembra essere la soluzione più semplice:

componente

Registrati MainMenu sulla barra degli strumenti, (in Visual Studio, menù uso "Strumenti", quindi l'opzione "Choose Toolbox Items", quindi trovare "MainMenu") e quindi utilizzarlo su un modulo anziché su MenuStrip.

Problemi correlati