Fare un form non attivabile in C #
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 !!
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 messaggioWM_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;
}
}