2010-10-27 11 views
12

Sto cercando di creare un modulo in C# che non possa accettare lo stato attivo, ovvero quando faccio clic su un pulsante nel modulo, il focus non viene rubato dall'applicazione che al momento ha lo stato attivo.Come posso creare un modulo "unfocusable" in C#?

Vedere la tastiera su schermo di Windows per un esempio. Si noti che quando si fa clic su un pulsante, lo stato attivo non viene preso dall'applicazione attualmente in uso.

Come posso implementare questo comportamento?

Aggiornamento:

scopre che è così semplice come sovrascrivendo la proprietà CreateParams e aggiungendo WS_EX_NOACTIVATE per lo stile della finestra estesa. Grazie per avermi indicato nella giusta direzione!

Sfortunatamente questo ha l'indesiderabile effetto collaterale che disturba il movimento del modulo, cioè puoi ancora trascinare il modulo sullo schermo ma il bordo della finestra non viene visualizzato durante il trascinamento, quindi è difficile posizionarlo con precisione.

Se qualcuno sa come risolvere questo sarebbe apprezzato.

+0

Possibile duplicato di [Mostra un modulo senza rubare lo stato attivo?] (Https://stackoverflow.com/questions/156046/show-a-form-without-stealing-focus) – rugk

risposta

9

Per disabilitare l'attivazione con il mouse:

class NonFocusableForm : Form 
{ 
    protected override void DefWndProc(ref Message m) 
    { 
     const int WM_MOUSEACTIVATE = 0x21; 
     const int MA_NOACTIVATE = 0x0003; 

     switch(m.Msg) 
     { 
      case WM_MOUSEACTIVATE: 
       m.Result = (IntPtr)MA_NOACTIVATE; 
       return; 
     } 
     base.DefWndProc(ref m); 
    } 
} 

Per mostrare forma senza attivazione (l'unico modo che ha funzionato per me nel caso della forma senza bordi):

[DllImport("user32.dll")] 
    public static extern bool ShowWindow(IntPtr handle, int flags); 

    NativeMethods.ShowWindow(form.Handle, 8); 

modo standard di fare questo (sembra che non funzioni per tutti gli stili di forma):

protected override bool ShowWithoutActivation 
    { 
     get { return true; } 
    } 

Se ci sono altri modi di attivare t forma, possono essere soppressi in modo simile.

+1

Sfortunatamente questo impedisce al modulo di concentrarsi quando cliccato, non impedisce all'ultima applicazione di perdere lo stato attivo. Grazie per avermi indicato verso la soluzione corretta però. – robinjam

+0

@robinjam Quindi qual è la soluzione corretta? – jnm2

+1

@ jnm2 Controlla la mia modifica sulla domanda originale: vuoi lo stile di finestra estesa 'WS_EX_NOACTIVATE'. https://msdn.microsoft.com/en-us/library/windows/desktop/ff700543 – robinjam

Problemi correlati