Domanda

Sono voler scrivere una tastiera virtuale, come Windows tastiera su schermo per PC touchscreen. Ma sto avendo problemi con la mia tastiera virtuale rubare il focus dall'applicazione in uso. La tastiera sullo schermo finestre mantiene il focus sull'applicazione corrente anche quando l'utente fa clic su di esso. C'è un modo per fare lo stesso con Windows Form in C #?

L'unica cosa che posso fare per ora è quello di inviare un evento di tastiera a un'applicazione especific, come blocco note nel codice seguente. Se potessi fare la forma non è attivabile, ho potuto ottenere la finestra focalizzata corrente con GetForegroundWindow.

[DllImport("USER32.DLL", CharSet = CharSet.Unicode)]
public static extern IntPtr FindWindow(string lpClassName,string lpWindowName);


[DllImport("USER32.DLL")]
public static extern bool SetForegroundWindow(IntPtr hWnd);

private void button1_Click(object sender, EventArgs e)
{
    IntPtr calculatorHandle = FindWindow("notepad", null);
    SetForegroundWindow(calculatorHandle);
    SendKeys.SendWait("111");
}

C'è un modo questo può essere fatto? Eventuali suggerimenti di un modo migliore per avere il modulo di invio degli eventi da tastiera per l'applicazione in uso?

Grazie !!

È stato utile?

Soluzione

Invece di cercare di ripristinare la finestra attiva dopo l'uno è stato fatto clic, avrei preferito cercare di evitare che la finestra di ricevere attenzione / possa essere azionata.

Dai un'occhiata alla questo articolo . Alla fine, l'autore spiega brevemente come questo può essere fatto:

  

Come faccio a impedire che la mia finestra di ottenere l'attivazione e la messa a fuoco quando mostrato?

     

In Windows Forms 2.0 c'è una nuova proprietà chiamata   ShowWithoutActivation - che si avrebbe bisogno di sostituire il modulo.   Nelle applicazioni native è possibile utilizzare SetWindowPos con il   Bandiera SWP_NOACTIVATE o lo ShowWindow con la bandiera SW_SHOWNA.

Inoltre, in questo articolo egli fornisce un esempio di codice per Windows Forms:

  

Se si desidera un modulo full-on, è ora possibile sostituire una proprietà chiamata   ShowWithoutActivation:

public class NoActivateForm : Form {  
    protected override bool ShowWithoutActivation {  
        get {  
            return true;  
        }  
    }  
}
     

Tenete a mente questo non “prevenire” attivazione per tutto il tempo - si può   ancora attiva chiamando i metodi Activate(), Focus() ... ecc. Se   si vuole evitare che i clic sui client area azionare il   finestra, è possibile gestire il messaggio WM_MOUSEACTIVATE.

private const int WM_MOUSEACTIVATE = 0x0021, MA_NOACTIVATE = 0x0003;

protected override void WndProc(ref Message m) {
    if (m.Msg == WM_MOUSEACTIVATE) {
         m.Result = (IntPtr)MA_NOACTIVATE;
         return;
    }
    base.WndProc(ref m);
}

Altri suggerimenti

Il suo risolto!

Ho provato la soluzione da gehho, ma ho anche bisogno di eseguire l'override del metodo CreateParams:

private const int WS_EX_NOACTIVATE = 0x08000000;
protected override CreateParams CreateParams
    {
        get
        {
            CreateParams createParams = base.CreateParams;
            createParams.ExStyle |= WS_EX_NOACTIVATE;
            return createParams;
        }
    }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top