製造元から提供されたActiveXコントロールを使用してUSBカードリーダーを動作させるための小さなテストプログラムを作成しました。
別のスレッドを使用しない限り、フォームは正常に機能します。の新しいインスタンスを作成してイベントをReader
リッスンすると、すべてが正常に機能します。Read
カードをスワイプすると、イベントが発生し、テキストボックスが更新されます。
private Reader _reader;
public Form1()
{
InitializeComponent();
CreateScanner();
}
public void CreateScanner()
{
_reader = new Reader();
_reader.Read += Read;
}
void Read(object sender, EventArgs e)
{
CardData.Text = "Card Read";
}
役立つ場合のリーダークラス:
public class Reader
{
private AxUSBHIDInsert _axUsbHid;
public event EventHandler Read;
public Reader()
{
_axUsbHid = new AxUSBHIDInsert();
_axUsbHid.CreateControl();
_axUsbHid.BeginInit();
_axUsbHid.MSRReadDir = MSRReadDirection.ReadWithdrawal;
_axUsbHid.EndInit();
_axUsbHid.PortOpen = true;
_axUsbHid.CardDataChanged += CardDataChanged;
}
void CardDataChanged(object sender, EventArgs e)
{
if (Read != null)
Read(this, new EventArgs());
}
}
ただし、これを別のスレッドで実行する必要があります。だから私はコンストラクターを次のように変更します
Thread thread = new Thread(CreateScanner);
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
STAスレッドである必要があります。そうでない場合、ActiveXコントロールはインスタンス化できないと文句を言います。ただし、これを行うと、イベントは発生しなくなります。私は糸脱毛がどのように機能するかについてあまりよく知らないので、理由はわかりません。
何か案は?コードは最終的には変更できないアプリケーションとともにデプロイされるクラスライブラリに存在するため、このように機能する必要があることに注意してください(別のスレッド、Readイベントに接続)。