4

私はここに来たばかりで、最初は本当に不思議な問題があります。私は英国のソフトウェア開発者で、15 年以上の経験がありますが、.Net での開発は 18 か月しか行っていません。NotifyIcon マウス イベントが発生しません。

C# を使用して、NotifyIcon (「メイン アプリ アイコン」) として開始し、マウスの右クリックで ContextMenu を表示するアプリケーションを作成しています。これは正常に動作します: ContextMenu、フォームの起動、およびマウス クリック イベントの起動。

ちょっとした背景: アプリケーションは、USB 'デバイス' の挿入を感知し (そうします)、それを問い合わせ、別の NotifyIcon ('デバイス アイコン') を作成して、ユーザーがそのデバイスと対話できるようにすることになっています。前の段落で説明した「メイン アプリ アイコン」を使用すると、ユーザーはデータベースと対話し、ソフトウェアを構成できます。

これらのデバイス インタラクション機能をカプセル化するために、デバイスの NotifyIcon、ContextMenu、フォーム、マウス クリック イベントなどを含む「デバイス クラス」を構築しました。これにより、デバイスとのインタラクションが可能になります。

問題 問題は、ManagementEventWatcher EventArrived イベントから「デバイス クラス」をインスタンス化するときに始まります。プログラム Main で「デバイス クラス」をインスタンス化すると、通知アイコンをクリックしたときにイベントが正しく発生します。

誰か助けてくれませんか?

乾杯、事前に

マシュー

4

3 に答える 3

3

IIRC、イベントの使用法 (ではなくWaitForNextEvent) は非同期で動作します。イベントが発生しているスレッドを知りたいです。アイコンのメッセージを処理するメッセージ ポンプがないのではないかと思います。

どこかにフォームはありますか?または、メッセージ ループのある別の何かですか? フォームを ( を使用して) 呼び出して、フォームControl.Invokeにアイコンを表示するように依頼したくなるでしょう。それ以降は、アクティブなメッセージ ポンプが必要です。


遅れて申し訳ありません; あなたのコメントを読むと、大まかに回避策があるようです。唯一の問題はクロススレッドの問題です。理想的には、UI スレッドでそのような変更を行うように UI に依頼します。たとえば、Formキックアラウンド(アイコンを所有している)がある場合-フォームクラスに追加します:

// not a property, as there is no need to add a complex x-thread "get"
public void SetIconVisible(bool isVisible) {
    if(this.InvokeRequired) {
        this.Invoke((MethodInvoker) delegate {
            myIcon.Visible = isVisible;
        });
    } else {
        myIcon.Visible = isVisible;
    }
}

これにより、(必要に応じて) UI スレッドへのスレッド切り替えが行われます。使い道は?

于 2009-10-13T11:15:24.203 に答える
1

したがって、答えは次のとおりです。

イベントは、NotifyIcon を表示するときにメイン スレッドで実行した場合にのみ機能します。したがって、Marc Gravell が提供するコードが解決策です。

于 2010-01-21T19:51:53.147 に答える
0

マーク、あなたに知らせるために -

メイン スレッドのメンバーとして NotifyIcon を持つクラス インスタンスを作成し、USB デバイスが接続されたときに NotifyIcon を表示できるようにしました。

ただし、NotifyIcon は最初に表示されるときに作成されるため、少し調整が必要でした。そのため、(メイン スレッドで) Visible を true に設定し、次に false に設定する必要がありました。インスタンスの数。

ManagementEventWatcher スレッドは、デバイスが接続されたときに Visible プロパティを true に設定できます。

回避策。

(コメントへの返信を参照)

于 2009-10-15T10:13:37.370 に答える