1

私の目標は、(独自の C# アプリケーションとして) フローティング ツールバーを作成することです。ユーザーがスクロール ホイールを使用すると、表示されるボタンを変更したいと考えています。簡単に聞こえますが、このワンライナーの問題である必要があります。

MouseWheel += new MouseEventHandler(Form1_MouseWheel);

私が抱えている問題は、アプリケーションにフォーカスがある場合にのみマウス ホイール ハンドラーが呼び出されることです。つまり、ユーザーは最初にクリックし、次にマウスホイールをクリックする必要があります。それは私がやろうとしていることにはなりません。

MouseHover イベント ハンドラーをフックし、form.Activate() を呼び出して、フォーカスを取得できます。ユーザーがアプリケーションにマウスを合わせた直後に (少し待つのではなく) スクロールホイールを使用すると、フォーカスは前のアプリに残り、マウスホイールイベントを取得するため、これは最適ではありません。

当然のことですが、MouseEnter イベントをフックしてそこで Activate() を呼び出しますが、アプリケーションが最前面に表示される代わりに、そのアイコンがタスク バーで点滅し始めます。私は Win7 を使用していますが、この問題はおそらくこれより古いものです。

理想的には、アプリケーションにフォーカスがあるかどうかを気にせずに、マウスホイール イベントを検出できるようにしたいと考えています。前のアプリケーションが入力フォーカスを維持する方が本当に良いでしょう。たとえば、ユーザーがメモ帳を使用している場合、ユーザーは入力し、マウスをアプリに合わせ、スクロール ホイールを使用し、表示されているものを見て、メモ帳での入力を再開することを決定できます。 . 理想的には、このシナリオでは一度もクリックする必要がないようにしたい.

ただし、他に方法がない場合は、アプリケーションにフォーカスを切り替えるソリューションで解決します。

これまでのところ、C# と Windows Forms を使用していますが、問題を解決できるのであれば、別のものを使用することにオープンです。

では、ユーザーが最初にアプリケーションをクリックしてフォーカスすることなく、これらのマウスホイール イベントを表示するにはどうすればよいでしょうか?

4

1 に答える 1

2

アプリケーションの外部でマウスイベントをキャッチする必要がある場合は、グローバルシステムフックを使用できます。ここに優れた.NET実装があります

于 2009-09-23T15:29:51.560 に答える