2009-05-14 10 views
0

Ich möchte ein virtuelles Nummernblock, ähnlich der Bildschirmtastatur erstellen. Wie verhindere ich, dass das Formular jemals aktiviert/fokussiert wird, so dass der SendKeys.Send-Aufruf auf die richtige Form wechselt, wenn ich auf einen Knopf drücke? Ich bin mir sicher, dass ich dafür eine nicht verwaltete API verwenden muss, aber außerdem bin ich mir nicht sicher, wo ich anfangen soll. Danke für jede Hilfe!Erstellen eines virtuellen Nummernblocks: Stop-Formular nicht aktiviert werden/Fokus

+0

Ist dies für eine Tastatur, die mit _any_ Anwendung funktioniert (wie die virtuelle Tastatur auf Tablets) oder nur für Apps, die Sie schreiben? –

+0

Nur für Apps, die ich schreibe. Ich überschreibe die WndProc-Methode, um die Nachricht.Result auf MA_NOACTIVATE zu setzen, aber es scheint, dass das Formular immer noch Fokus erhält, wenn ich auf eine Schaltfläche klicke. –

Antwort

1

Sie die Art und Weise Ihre Form durch Überschreiben der geschützten CreateParams Eigenschaft erstellt steuern:

protected override CreateParams CreateParams { 
    get { 
    var cp = base.CreateParams; 
    // Configure the CreateParams structure here 
    return cp; 
    } 
} 

ich den folgenden Stil empfehlen versuchen:

int WS_EX_NOACTIVATE = 0x08000000; 
cp.ExStyle = cp.ExStyle | WS_EX_NOACTIVATE; 

Der WS_EX_NOACTIVATE Stil verhindert Mauseingabe Einen Fensterfokus zu geben (z. B. können Sie damit QuickInfo-ähnliche Fenster erstellen.)

Sie können dies mit anderen Stilen (wie WS_EX_TOPMOST) kombinieren, um das gewünschte Verhalten zu erhalten.

0

Ein Formular, das keinen Fokus hat, erhält im Allgemeinen keine Tastatureingabe. Ich bin also nicht sicher, wie Sie das zur Arbeit bringen würden.

0

Wenn das Numpad nur in den von Ihnen geschriebenen Apps funktionieren muss, können Sie einfach das letzte gültige Eingabesteuerelement im Fokus behalten. Auf diese Weise müssen Sie sich nicht um etwas kümmern, das den Fokus stiehlt. Ich habe kürzlich etwas Ähnliches gemacht, indem ich eine Menge TextBoxes 'Enter' -Ereignis an den gleichen Event-Handler abonniert habe, der mein fokussiertes Steuerelement auf den sender-Parameter gesetzt hat. Diese genaue Methode funktioniert möglicherweise nicht für Sie, aber der Ansatz könnte es einfacher machen.

0

Mit Apps, die Sie schreiben, betrachten Sie das Observer-Muster.

Im allgemeinen Fall können Sie Ihrer Tastatur eine Subscribe-Methode hinzufügen, die einen Delegaten akzeptiert (auch das Abbestellen zulassen). Blättern Sie bei der Verarbeitung von Schlüsselpressereignissen durch alle abonnierten Teilnehmer, die den Zeichencode senden.

-Code (meist aus dem Gedächtnis, wahrscheinlich Schnipsel wird nicht kompiliert, sondern sollten Sie gehen bekommen)

delegate void KeyPadSubscription (char keyPressed); 
List<KeyPadSubscription> subscriptions; 

void KeyPress (object sender, KeyPressArgs e) 
{ 
    foreach (KeyPadSubscription sub in subscriptions) 
     sub (e.CharCode) 
} 

void Subscribe(KeyPadSubscription s) 
{ 
    subscriptions.Add(s); 
} 

void Unsubscribe(KeyPadSubscription s) 
{ 
    subscriptions.Remove(s); 
} 

In Ihrem Fall, Sie wahrscheinlich nicht brauchen, um die Liste der Delegierten und eine Eigenschaft ausreichen könnte. Wenn Ihre Formulare den Fokus ändern, legt das aktive Formular seine Methode als Delegat für die Tastatur fest.

void MyForm_Activated(...) 
{ 
    //assumes keypad is global or static 
    KeyPad.Subsribe (this.HandleKeyPadPress) 
} 
Verwandte Themen