2009-05-14 7 views
0

オンスクリーンキーボードと同様に、仮想数字パッドを作成します。どのように私はそれにボタンを押すと、フォームを活性化/フォーカスされていることを防ぐために、SendKeys.Sendコールは、正しいフォームに行く?私はこれに対して管理されていないAPIを使用しなければならないと確信していますが、それ以外にもどこから始めるべきかはわかりません。助けてくれてありがとう!仮想数字パッドの作成:フォームのアクティブ化/フォーカスの停止を

+0

これは、_any_アプリケーション(タブレットの仮想キーボードのような)で動作するキーボード用であるか、あなたが作成するアプリケーション用ですか? –

+0

私が書くアプリのみ。私はWndProcメソッドをオーバーライドしてmessage.ResultをMA_NOACTIVATEに設定しましたが、ボタンをクリックしてもまだフォームにフォーカスが得られているようです。 –

答えて

1

あなたは、フォームが保護CreateParamsをプロパティをオーバーライドすることによって作成された方法で制御できます。

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

WS_EX_NOACTIVATEスタイルは、マウス入力を防止:私は次のスタイルをしようと提案し

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

をウィンドウをフォーカスしないようにします(たとえば、これを使用してツールチップのようなウィンドウを作成できます)。

これを他のスタイル(WS_EX_TOPMOSTなど)と組み合わせて、後の動作を取得できます。

0

フォーカスを持たないフォームは、通常、キーボード入力を受けません。だから私はあなたがこれをどのように働かせるかわからない。

0

あなたが書き込むアプリケーションで数字パッドが機能する必要があるだけの場合、フォーカスを持っている最後の有効な入力コントロールを追跡することができます。そうすれば、フォーカスを盗む何かを心配する必要はありません。私は最近、TextBoxesのEnterイベントを、送信側パラメータにフォーカスを当てたコントロールハンドルを設定した同じイベントハンドラに登録することで、何か似たようなことをしました。この正確な方法はあなたのためにはうまくいかないかもしれませんが、アプローチが簡単になるかもしれません。

0

あなたが書くアプリケーションでは、Observerパターンを考慮してください。

一般的に、デリゲートを取るサブスクリプションメソッドをキーパッドに追加することができます(購読解除も可能です)。キープレスイベントの処理では、登録されたすべてのデリゲートをループして文字コードを送信します。

コード(主にメモリから、スニペットはおそらくコンパイルされませんが、あなたが軌道に乗る必要があります)お使いの場合には

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); 
} 

、あなたはおそらく、デリゲートのリストを必要としないと財産で十分でした。フォームがフォーカスを変更すると、アクティブなフォームはそのメソッドをキーパッドの代理人として設定します。

void MyForm_Activated(...) 
{ 
    //assumes keypad is global or static 
    KeyPad.Subsribe (this.HandleKeyPadPress) 
} 
関連する問題