Visual StudioでC#のアプリケーションを開発しています。
常駐アプリを作りたいのでタスクバーにアイコンを出力して、アイコンにアプリケーション終了用の右クリックメニューを持たせています。
アプリでは、接続されたデバイスを監視する必要があります。
この処理を実装すると、右クリックメニューが機能しない問題が発生しました。
監視、右クリックメニューのどちらかずつであれば機能させられますが、両方同時に機能をさせられません。
恐れ入りますが、何か解決方法があればご教示頂けないでしょうか?
状況
カードを読み込む処理自体は作成出来ました。
機能を常駐アプリに統合する所で躓いています。
実現したい事
外付けのカードリーダーでカードを読み取って、
別のアプリケーションに対して何らかの処理をするというアプリケーションを作りたいです。
常にカードを読み込める状態にしたいので、常駐アプリとして実装しようと考えています。
デザイン
NotifyIconWrapperと言うコンポーネントを作成しました。
タスクバーにアイコンを表示し、右クリックメニューが表示できるように下記のツールを配置しています。
- NotifyIcon
- ContextMenuStrip
ContextMenuStripには、アプリ終了用にtoolStripMenuItemExit
と言うアイテムを追加しています。
ソース
NotifyIconWrapper.cs
「終了」メニューだけなので次のようなソースです。
常に動かしたい処理はthis.nfcMain.start()
の部分です。
詳細は後述しますが、カードリーダーの読み込み状態を維持するための関数です。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; using CardReader.Classes.NfcReader; namespace Sample.Components { public partial class NotifyIconWrapper : Component { /// <summary> /// nfc接続用のクラス /// </summary> private NfcMain nfcMain; /// <summary> /// コンストラクタ /// </summary> public NotifyIconWrapper() { InitializeComponent(); // 終了メニューのイベントリスナーを設定 this.toolStripMenuItemExit.Click += new EventHandler(this.toolStripMenuItemExit_Click); // カードリーダースタンバイ開始 this.nfcMain = new NfcMain(); this.nfcMain.start(); } /// <summary> /// コンテナで初期化する場合のコンストラクタ /// </summary> /// <param name="container"></param> public NotifyIconWrapper(IContainer container) { container.Add(this); InitializeComponent(); } /// <summary> /// コンテキストメニュー、「終了」のイベント /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void toolStripMenuItemExit_Click(object sender, EventArgs e) { System.Windows.Application.Current.Shutdown(); } } }
NfcMain.cs
カードリーダー用のクラスです。
原因になっている個所を抜粋して記載します。
やっている事はカードリーダーを起動して、常にカードリーダーから状態を監視するという処理です。
参考までに下記のサイトを参考にしています。
PC/SC APIを用いてSuicaカードの利用履歴情報の読み取り
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Diagnostics; namespace Sample.Classes.NfcReader { /// <summary> /// カードリーダーの制御統括クラス /// </summary> class NfcMain { /// <summary> /// カードリーダー読み込み /// </summary> public void start() { IntPtr context = establishContext(); List<string> readerList = getReaders(context); NfcApi.SCARD_READERSTATE[] readerStateArray = initializeReaderState(context, readerList); bool quit = false; while (!quit) { waitReaderStatusChange(context, readerStateArray, 1000); // リーダーの状態が、カード接続状態になったら読み込み処理を実行 if ((readerStateArray[0].dwEventState & NfcConstant.SCARD_STATE_PRESENT) == NfcConstant.SCARD_STATE_PRESENT) { ReadResult result2 = readCard(context, readerStateArray[0].szReader); SendCommand(context, readerStateArray[0].szReader); quit = true; } } // カードリーダーの接続状態を解除する uint ret = NfcApi.SCardReleaseContext(context); }
実行結果
タスクメニューにアイコンは表示されて、カードを読み込む処理は出来ます。
しかし、右クリックメニューが表示されません。
原因と思われる個所と所見
NfcMainのstart関数で、while分を用いたループをしているのが起因している可能性があります。
ループ処理をコメントアウトするとメニューが表示できます。
監視するためには繰り返しで状況を見ないといけないと思うのですが、そもそもコンストラクタで繰り返しの処理は使えないのでしょうか?
回答1件
あなたの回答
tips
プレビュー