3

私が探しているのは、Google デスクトップに似た機能です。連打Ctrlすると小さな検索ボックスが出てきます。

どこかで見つけたかなり重いキーボード フック クラスを使用してみましたが、予測不可能な結果が得られました (つまり、最初に機能し、次に 1Ctrl回押すと、キーが押されたイベントが数回発生しますか?)。

とにかく、これは複雑であるようには見えないので、何か間違ったことをしているに違いないと感じています。私のアプリ (WPF アプリ) は、プライマリ ウィンドウの可視性を非表示に設定して実行され、タスク バーには表示されません。Ctrl-を実行するCtrlと、それをキャッチしてウィンドウを表示したい。

もう1つの副次的な問題-現在、ホットキーを登録してこれを行っていますが、それでは必要な機能がすべて得られません(の2回押しCtrl)。ウィンドウが表示されているときに、フォーカスがなくなったことを 100% 確実に検出する方法は見つかりませんでした (これが発生した場合は、再度非表示にしたいと考えています)。Deactivated、LostFocus などに応答しようとしましたが、ほとんどの場合、それらは機能します。しかし、実際にはアクティブ化されていない、またはフォーカスを受けていない状態で、ウィンドウが表示されているように見えることがあります。これについてもアイデアはありますか?

ありがとう!
アダム

4

2 に答える 2

3

SetWindowsHookExを使用して、低レベルでキーボード イベントにフックすることをお勧めします。

C++ のサンプル コードを次に示します。pinvoke.net のエントリは、これを C# に移植するのに役立ちます。

直接使用できる C# コードについては、このCodeProject サンプルを試すことができます。私の記憶によると、いくつかのバグはありますが、ほとんどの場合は機能していました。ある時点で、私はこれを Jad Engine に移植するのを手伝いました。そこで、これを実現するクラス ( UserActivityHook ) を実装し、プロセスのいくつかのバグを修正しました。始めるにはとても良い場所かもしれません...

于 2009-06-10T21:26:18.413 に答える
2

2 番目の質問については、表示時にフォームがアクティブ化されていない場合は、表示後にForm.Activateを呼び出す必要があります。簡単なデバッグの場合は、GotFocus、LostFocus、Enter、Exit、および Activate、Deactivate イベントにトレース ステートメントを配置し、これらのいずれかがニーズを一貫して満たしているかどうかを確認します。

于 2009-06-11T01:17:52.957 に答える