2016-12-08 9 views
0

私はVisual C#をかなり新しくしていますが、Delphiで長い間コード化しています。私はキーボード上の特定のキーを入力しない限り隠されているシンプルなパネルを持ったフォームを作成しました(私は "KeyPreview"をフォームにtrueに設定していますが、KeyDownイベントを使って正しいキーパネルを表示/非表示にする)。パネルのすぐ下にはwebBrowserコンポーネントがあります。次のように何が起こっているC#フォームにフォーカスがあることを確認する

は次のとおりです。

私のフォームを最初に起動すると、私は、フォームが最初にフォーカスを持っているを確認します「示す」イベントのコードがあります。

private void Form1_Shown(object sender, EventArgs e) 
{ 
    if (!Focused) 
    { 
     Focus(); 
    } 
} 

はフォームがあるときにこの時点では、適切なキーストロークを検出してパネルを表示または消滅させるためのコードは正常に動作します。

ここでは、物事が奇妙になり、私は何をすべきか分からない。私が間違っている何のために取り扱っております2つの部分があります。

  1. 私は別のフォームをクリックし、自分のフォームのキャプションバーに再び私のフォーム上のフォーカスを取得し、キーストロークをしようとする場合は、キーストロークの検出は、動作しません。しかし、別のフォームをクリックしてもう一度フォームに戻ると、フォームのキーストロークの検出が機能します。私のfromに再度焦点が当てられるたびに、これが確実に機能するようにするにはどうすればよいですか?

  2. フォーム内のWebブラウザコンポーネントをクリックすると、フォームのKeyDownコードが制定されなくなります。フォームのキャプションバーをクリックしても、KeyDownイベントは機能しません。私のフォーム内のコンポーネントがクリックされた場合、私のフォームは引き続きKeyDownイベントに応答することを保証するために何をする必要がありますか?

ありがとうございました。

+0

キャプションバーのコードを表示できますか? –

+0

それだけです。キャプションバーのコードはありません。私はちょうどフォーム自体のKeyDownイベントのコードを持っています。 – Andre72127

答えて

0

キャプションバーがキーイベントをインターセプトしているように見える理由はわかりません。フォーム上のさまざまなコンポーネントがフォーカスを取得し、キーボードイベントを取得する可能性があります。私は、Webブラウザコントロールがこのように動作することを知っています。キーボードイベントをグローバルにキャプチャすることを検討することができます。

私はCodeprojectに何かこれを行う方法を見ました。私はこれが役立つことを願っています

これらはUserActivityHooksを使用します。

UserActivityHook actHook; 
void MainFormLoad(object sender, System.EventArgs e) 
{ 
    actHook= new UserActivityHook(); // crate an instance 

// hang on events 

    actHook.OnMouseActivity+=new MouseEventHandler(MouseMoved); 
    actHook.KeyDown+=new KeyEventHandler(MyKeyDown); 
    actHook.KeyPress+=new KeyPressEventHandler(MyKeyPress); 
    actHook.KeyUp+=new KeyEventHandler(MyKeyUp); 
} 

ウェブブラウザコントロールに関しては、もちろんキーボードイベントをインターセプトする予定です。ユーザーはしばしばフォームにテキストを入力する必要があり、開発者はキーボードイベントに具体的にフックするためにウェブページ上にJavaScriptをコードすることがよくあります。したがって、Webブラウザコントロールはそれらを取得できなければなりません。

関連する問題