2015-02-20 12 views
7

C'è un modo per mostrare un MessageBox in C# senza un focus su un pulsante nella finestra del messaggio? Ad esempio, il seguente frammento di codice (che non funziona come voluto):MessageBox senza focus su un MessageBoxButton

MessageBox.Show("I should not have a button on focus", 
         "Test", 
         MessageBoxButtons.YesNo, 
         MessageBoxIcon.Question, 
         MessageBoxDefaultButton.Button3); 

quello che voglio è che la MessageBox è mostrato senza un focus su [Sì] o [No]. Lo sfondo è che il cliente esegue la scansione di diversi codici a barre che hanno un ritorno a capo al e. Quindi, quando viene visualizzata la finestra dei messaggi e scansionano ulteriori codici a barre senza notare la finestra del messaggio, "premono" un pulsante.

+0

temo che non è possibile con un MessageBox di vaniglia, in quanto basta consiste in un mazzo di pulsanti e una statica, l'ultima dei quali non può avere il focus. Quindi almeno un pulsante ha sempre la messa a fuoco. Potresti forse aggiungere Annulla al mix, renderlo predefinito e semplicemente mostrare nuovamente la finestra del messaggio se è stato premuto Annulla. – Joey

+0

Penso che il modo più semplice sarà implementare MessageBox dal proprio modulo .... –

+0

Certamente si può fare. Se possiedi il computer, apri il computer. Ma 'MessageBox' non fornisce un modo _conveniente_ perché non ci sia un default. Premendo ** Ritorno ** si rifiuta sempre la finestra di dialogo con un certo valore. Nota, ovviamente, che puoi impostare un terzo pulsante come predefinito (i.e il pulsante 'Annulla' di una casella' YesNoCancel') e richiedono all'utente di premere qualcosa di diverso da 'Annulla' per procedere; hai appena visualizzato nuovamente la scatola fino a quando non lo fanno. –

risposta

3

Questo non è possibile con il MessageBox standard: sarà necessario implementare il proprio se si desidera questa funzionalità.

Vedere here per iniziare.

+1

Credo che sia giusto. Il 'MessageBox.Show' di .NET è solo un wrapper della funzione MessageBox di Win32 che non ha alcuna opzione del genere: https://msdn.microsoft.com/en-us/library/windows/desktop/ms645505(v=vs. 85) aspx – vesan

7

Beh, puoi farlo con un po 'di trucco.

[DllImport("user32.dll")] 
static extern IntPtr SetFocus(IntPtr hWnd); 

private void button1_Click(object sender, EventArgs e) 
{ 
    //Post a message to the message queue. 
    // On arrival remove the focus of any focused window. 
    //In our case it will be default button. 
    this.BeginInvoke(new MethodInvoker(() => 
    { 
     SetFocus(IntPtr.Zero);//Remove the focus 
    })); 

    MessageBox.Show("I should not have a button on focus", 
       "Test", 
       MessageBoxButtons.YesNo, 
       MessageBoxIcon.Question, 
       MessageBoxDefaultButton.Button3); 
} 

Si noti che il codice di cui sopra presuppone che quando si chiama BeginInvokeMessageBox viene mostrato e ha ottenuto il pulsante di fuoco. Di solito sarà il caso fino alla mia conoscenza. Se si desidera assicurarsi che la casella di messaggio sia già visualizzata, è possibile utilizzare this code per trovarla e quindi rimuovere lo stato attivo.

0
  • aggiungere un nuovo modulo per il nome del progetto che msg
  • aggiungere un'etichetta a questa forma, scrivere il messaggio nel testo di questa etichetta
  • aggiungere un button1 con la sua proprietà text impostata OK
  • add un textBox1 con la Visible proprietà insieme al false
  • aggiungere questo codice in msg_FormLoad():

    0.123.

    txtBox1.Focus();

  • aggiungere questo codice per buton1_Click:

    this.Close();

  • ogni volta che si desidera visualizzare il messaggio si può solo:

    msg MsgBox msg = new(); msgBox.ShowDialog();

  • terminato!

PS: non testato a causa della mancanza di IDE per il momento, ma credo che può essere regolato per lavorare con poco sforzo