Announcement

Collapse
No announcement yet.

Windows Mesaging und Callback Ereignisse vom ScardServer

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Windows Mesaging und Callback Ereignisse vom ScardServer

    Hallo zusammen,

    ich habe ein SmartCard-Reader von Towitoko
    und versuche mit Hilfe einer c# Schnittstelle
    die Windows-Bootschaften zum empangen und wieder zu entfernen und auch die Ereignisse vom Server (z.B OnCardValid,OnCardLocked ...) zu realisiren.

    Unter Delphi kann man wie folgendes realisiren. Aber Unter C# wie kann man diese verwirklichen ? Für Ihre Hilfe wäre ich
    sehr dankbar.

    type
    ESmartCard = Exception;
    ...

    TCardEvent = procedure (Sender: TObject; DeviceIndex: Integer) of object;
    TCardLockEvent = procedure (Sender: TObject; DeviceIndex, TaskIndex: Integer) of object;
    TSearchEvent = procedure (Sender: TObject; Port, Progress: Integer) of object;

    TSmartCard = class(TComponent)
    Private
    ...
    FWindowHandle: HWND;
    procedure MyWndProc(var Msg: TMessage);
    ....

    Implementation

    constructor TSmartCard.Create(AOwner: TComponent);
    begin
    inherited Create(AOwner);
    FWindowHandle := AllocateHWnd(MyWndProc);
    ...
    end;

    procedure TSmartCard.MyWndProc(var Msg: TMessage);
    type Int = {$IFDEF WIN32}ShortInt{$ELSE}Integer{$ENDIF};
    var A,B: LongInt;
    begin
    with Msg do
    begin
    if Msg <> TDEVMSG then
    Result := DefWindowProc(FWindowHandle,
    Msg, wParam, lParam);
    else if not FEnabled then begin
    if WParam = MsgActive then
    Comand(cmCard+cmUnlock,nil,0,nil,0);
    end else begin
    if WParam = MsgActive then begin
    SetStatusTyp('CrdReady',['']);
    FDevice:=Int(LParam and $FFFF);
    if Assigned(FOnCardActive) then begin
    try
    FOnCardActive(self,FDevice);
    finally
    if FAutoUnlock then
    Comand cmCard+cmUnlock,nil,0,nil,0);
    end;
    ...
    end;
    end;

  • #2
    tut mir leid, ich habe die Formatierung vergessen. Nochmal die Quellcode:
    <PRE>

    type
    ESmartCard = Exception;
    ...

    TCardEvent = procedure (Sender: TObject; DeviceIndex: Integer) of object;
    TCardLockEvent = procedure (Sender: TObject; DeviceIndex, TaskIndex: Integer) of object;
    TSearchEvent = procedure (Sender: TObject; Port, Progress: Integer) of object;

    TSmartCard = class(TComponent)
    Private
    ...
    FWindowHandle: HWND;
    procedure MyWndProc(var Msg: TMessage);
    ....

    Implementation

    constructor TSmartCard.Create(AOwner: TComponent);
    begin
    inherited Create(AOwner);
    FWindowHandle := AllocateHWnd(MyWndProc);
    ...
    end;

    procedure TSmartCard.MyWndProc(var Msg: TMessage);
    type Int = {$IFDEF WIN32}ShortInt{$ELSE}Integer{$ENDIF};
    var A,B: LongInt;
    begin
    with Msg do
    begin
    if Msg <> TDEVMSG then
    Result := DefWindowProc(FWindowHandle,
    Msg, wParam, lParam);
    else if not FEnabled then begin
    if WParam = MsgActive then
    Comand(cmCard+cmUnlock,nil,0,nil,0);
    end else begin
    if WParam = MsgActive then begin
    SetStatusTyp('CrdReady',['']);
    FDevice:=Int(LParam and $FFFF);
    if Assigned(FOnCardActive) then begin
    try
    FOnCardActive(self,FDevice);
    finally
    if FAutoUnlock then
    Comand cmCard+cmUnlock,nil,0,nil,0);
    end;
    ...
    end;
    end;

    </PRE&gt

    Comment


    • #3
      Hallo,

      in Delphi sorgt AllocateHWnd dafür, dass ein Fenster-Handle zur Verfügung steht und die Windows-Botschaften über die eigene Fensterprozedur ausgewertet werden können.

      In C# ist die Vorgehensweise die Gleiche - wobei es vermutlich das Einfachste ist, ein Formular (das ja nicht unbedingt für den Benutzer sichtbar sein muss) zu nutzen.

      Das folgende Beispiel demonstriert dies. Das Formular schickt über PostMessage an sich selbst eine private Botschaft, die über die überschriebene Methode <b>WndProc</b> ausgewertet wird.

      <pre>

      const int WM_APP = 0x8000; // aus WinUser.h

      protected override void WndProc(ref System.Windows.Forms.Message msg)
      {
      switch(msg.Msg)
      {
      case WM_APP:
      MessageBox.Show("WM_APP");
      break;
      default:
      break;
      }
      base.WndProc(ref msg);
      }

      // using System.Runtime.InteropServices;

      [DllImport("user32.dll")]
      extern static int PostMessage(int hWnd, int Message, int wParam, int lParam);

      private void button1_Click(object sender, System.EventArgs e)
      {
      PostMessage(this.Handle.ToInt32(), WM_APP, 0, 0);
      }

      </pre&gt

      Comment


      • #4
        Hallo Herr Kosch,

        Vielen Dank für Ihre Antwort. Das versuche ich heute in meiner Schnitstelle zu realisiren.<BR>

        Mit freundlichen Grüßen<BR>
        Simon

        Comment


        • #5
          Hallo Herr Kosch,

          Die Realisierung mit WndProc hat geklappt. Ich habe WndProc von UserControl benutzt und in Applikationsfenster getestet. Alles läuft wunderbar, falls das Applikationsfenster aktive ist. Wenn ich während der laufenden Testapplikation auf andere Applikation klicke (z.B. auf Word), denn sicht man auf dem Fenster keine Ereignisse mehr, nämlich keine Meldungen mehr zu bekommen. Die Ereignisse soll man auch bekommen, falls das Applikationsfenster nicht aktive ist. <P>
          Vermutlich stammt das Problem aus <I>Windows Handle</I>. Aber wie kann man den Fehler
          beheben ist fraglich. Jetzt ich möchte gern wissen, wie kann man das realisiren. <BR>
          Für jede Hilfe bin ich sehr dankbar.

          <BR>
          Viele Grüße,
          <BR>
          Simon Yakamo

          Comment

          Working...
          X