介接 MultiBio 門禁考勤人臉指紋機時,利用官網提供的 zkemkeeper SDK,能正確讀取設備上的打卡資料,但想要即時接收打卡事件時,完全照抄官方範例,卻怎樣都收不到設備即時回傳的事件。最大的差別在於官方範例是一個 Windows Forms 程式,我正在開發的是一個主控台(Console)程式。
可能原因是 zkemkeeper SDK 收到設備即時回傳事件後,使用的訊息派送機制跟 Windows Forms 程式會用到的 Message Loop 相關。所以嘗試在一開始就用 Application 提供的 Run() 方法,執行目前執行緒的標準應用程式 Message Loop。
記得要用 .NET Framwork 專案,而不是 .NET / .NET Core 專案(C# 工程師可能才知道我在說什麼),要不然沒有 System.Windows.Forms.Application 可以用,完整程式碼如下:
Thread thread = new Thread(() =>
{
zkemkeeper.CZKEMClass axCZKEM1 = new zkemkeeper.CZKEMClass();
bool bIsConnected = false; // the boolean value identifies whether the device is connected
int idwErrorCode = 0;
bIsConnected = axCZKEM1.Connect_Net("x.x.x.x", Convert.ToInt32("4370"));
if (bIsConnected == true)
{
iMachineNumber = 1;// In fact,when you are using the tcp/ip communication,this parameter will be ignored,that is any integer will all right.Here we use 1.
bool regEventResult = axCZKEM1.RegEvent(iMachineNumber, 65535);//Here you can register the realtime events that you want to be triggered(the parameters 65535 means registering all)
}
else
{
axCZKEM1.GetLastError(ref idwErrorCode);
Console.WriteLine(String.Format("Unable to connect the device, ErrorCode={1}", idwErrorCode.ToString()));
}
axCZKEM1.OnAttTransactionEx += new zkemkeeper._IZKEMEvents_OnAttTransactionExEventHandler(axCZKEM1_OnAttTransactionEx); // 註冊監聽事件
Application.Run();
});
thread.IsBackground = true;
//thread.SetApartmentState(ApartmentState.STA); // 我註解掉也可以運作!
thread.Start();
Console.ReadLine(); // 接收到輸入才會結束程式
0 則回應: