MultiBio zkemkeeper.CZKEMClass 無法監聽即時事件

MultiBio700 門禁考勤人臉指紋機

介接 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 則回應: