2

Win Forms の NotifyIcon を使用して、WPF C# アプリケーションのシステム トレイ アイコンを作成しています。

ユーザーがコンテキスト メニューのアイコンを右クリックすると、Alt-F4 を押すことができ、アイコンがトレイから消えますが、メインの WPF アプリケーションはまだ実行されているというバグがあります。これは、「systray に最小化」され、アプリケーションの唯一の制御がなくなった場合に特に問題になります。

システムトレイでこれを具体的に処理する方法を知っている人はいますか? NotifyIcon のドキュメントを見てきましたが、キープレス イベントに関連するものは何もありません。

更新: これは、systray と実際のバグの使用方法を示すサンプル アプリケーションです。http://cid-e75a75f1a1fbfbb5.office.live.com/self.aspx/.Public/WpfApplication1.zip?sa=221089565

4

5 に答える 5

1

まず、プロジェクトで非表示ウィンドウを設定し、true のcontextMenuStrip2_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)場合にイベントでアクティブ化できます。 次に、非表示ウィンドウのクローズを無効にすると、このバグを修正できます。e.alt

例えば:

//public partial class HotKeyWin : Window // WindowStyle="ToolWindow"

public partial class NotifyIconWrapper : Component
{
    private HotKeyWin hkeyWin = new HotKeyWin();

    public NotifyIconWrapper()
    {
         hkeyWin.Show();
         hkeyWin.Closing += new CancelEventHandler(hkeyWin_Closing);                
         hkeyWin.Hide();
    }

    void hkeyWin_Closing(object sender, CancelEventArgs e)
    {
         Console.WriteLine("hkeyWin_Closing enter");
         e.Cancel = true;           
    }

    private void contextMenuStrip2_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
    {
         if (e.Alt) hkeyWin.Activate();
    }
}
于 2010-11-29T07:28:08.007 に答える
0

まあ、それはトリッキーだったと言わざるを得ませんが、いくつかの簡単なテストの後、これでうまくいくと思います.

    private void Form1_Load(object sender, EventArgs e)
    {
        this.Activated += new EventHandler(Form1_Activated);
    }

    void Form1_Activated(object sender, EventArgs e)
    {
        string iconPath = "some file system path";
        notifyIcon1.Icon = new Icon(iconPath);
    }

アイコンが消えないようにすることはできませんが、少なくともアプリケーションがフォーカスされると、アイコンは再実行されます。

アイコンを作成し続ける必要がないように、アイコンを保存することもできます。

于 2010-06-17T16:40:00.030 に答える
0

これはバグであり、Microsoft Connect に報告しました。私が推測する更新については、こちらを確認してください: https://connect.microsoft.com/VisualStudio/feedback/details/568590/unable-to-disable-alt-f4-on-winforms-notifyicon-when-context-menu-is-open ?wa=wsignin1.0

于 2010-07-27T17:57:16.447 に答える
0

WinFormHost で NotifyIcon を使用していると思いますか? NotifyIcon は単にフォーム上のコントロールであるため、おそらくメイン フォームでイベントを消費する必要があり、メイン ウィンドウが非表示の場合は、(疑似) のようにキーストロークを無視します。

public mainForm_keypressed(object sender, //eventargs
{
  if(_hidden && //Keystroke detection)
  {
    e.Handled = true;
    return;
  }
}

編集

http://www.codeproject.com/KB/WPF/wpf_notifyicon.aspxこれは、調べる価値のあるものかもしれません。

于 2010-06-17T16:18:19.757 に答える