5

システム トレイにアイコンを配置し、機能を実行するためのグローバル キーボード ショートカットを設定しようとしています。

RegisterHotKey を使用してグローバル キーボード ショートカットを設定していますが、アイコンに関連付けられたメイン フォームが表示されている場合に機能します。ただし、フォームが非表示の場合、WndProc メソッドは呼び出されません。

何か案は?

編集:「非表示」とは、メインフォームに次のものが追加されることを意味します。

protected override void OnLoad(EventArgs e)
{
    hotKey = new GlobalHotkey(GlobalHotkey.WIN, Keys.T, this);
    bool registered = hotKey.Register();
    Visible = false;
    ShowInTaskbar = false;
    base.OnLoad(e);
}

「登録済み」は「true」と表示され、「Visible = false;」を省略してもショートカットキーは正常に機能します。および「ShowInTaskbar = false;」。

4

2 に答える 2

5

問題は、ShowInTaskbar を false に設定するとウィンドウ ハンドルが変更されることです。これは、RegisterHotkey に渡された hwnd が無効になることを意味します。

ShowInTaskBar を設定したにホットキーを登録すると、正常に機能します。

于 2012-05-12T07:00:32.277 に答える
4

Winformsは、winapiのかなり厳しい制限を回避します。ウィンドウの一部のプロパティは、ウィンドウの作成時にのみ指定でき、後で変更することはできません。つまり、ネイティブのCreateWindowEx()呼び出しで指定されます。

CreateWindowEx()を再度呼び出すことで回避します。つまり、既存のウィンドウを破棄して、再度作成します。これは気の利いたトリックですが、いくつかの副作用があります。たとえば、新しいウィンドウがそれ自体をペイントするときに、わずかなちらつきが見られます。いくつかの大きな副作用は、たとえばTreeViewで見られます。再作成されると、すべてのノードが折りたたまれます。回避するのは難しいですが、元のウィンドウに関連付けられている状態が多すぎます。フォームの場合、ShowInTaskbarプロパティはそのようなプロパティの1つです。ただし、RightToLeft、FormBorderStyle、ControlBoxなどもあります。

最も関連性のある副作用はあなたが遭遇しているものです。ウィンドウを再作成すると、必然的に、Handleプロパティが常に変更されます。そして、RegisterHotKey()またはそれを使用するライブラリを使用すると、winapi呼び出しがウィンドウハンドルを使用するという問題が発生します。したがって、Winformsがそのウィンドウを破棄しても、コールバックは二度と発生しません。

修正は簡単です。間違ったイベントハンドラーを使用しているだけです。OnHandleCreated代わりに、メソッドのオーバーライドで呼び出しを行ってください。ウィンドウが再作成されると再実行されます。さらにもう1つの簡単な修正は、信頼性はほとんどありませんが、コンストラクターでShowInTaskbarなどのプロパティのみを設定することです。

于 2012-05-12T12:03:05.993 に答える