Реализация события при отключении (извлечении) ключа из usb-порта

Хотелось бы узнать есть ли возможность реализовать внутри программы вызов события при извлечении ключа, причем сделать это до выскакивания сообщения от армора о необходимости вставленного ключа? Есть ли такое в guardant api? Я видел только функцию поиска ключа..Суть в том, что надо сделать отключение подключения к базе до того, как армор заметит, что ключ вытащен, затем вернуть ключ, нажать на кнопку "Повтор" в сообщении от армора и снова сделать коннект к базе.

Re: Реализация события при отключении (извлечении) ключа из usb-порта

Отследить событие извлечения электронного ключа можно при помощи Notification API, но гарантировать его срабатывание раньше чем Guardant Armor нельзя. Т.е. в разных условиях на извлечение ключа раньше может среагировать как Guardant Armor, так и Notification API.

Позже (пока непонятно наколько позже) реализуем чтобы можно было реагировать на на такие события из API заведомо раньше.

Re: Реализация события при отключении (извлечении) ключа из usb-порта

Если кому интересно, то получилось реализовать данную затею. Использовал атрибут в арморе -silent и winapi.

Re: Реализация события при отключении (извлечении) ключа из usb-порта

Если не сложно, то опишите, пожалуйста, свое решение.

Re: Реализация события при отключении (извлечении) ключа из usb-порта

Антон Тихиенко пишет:

Если не сложно, то опишите, пожалуйста, свое решение.

Я извиняюсь, не увидел Вашу сообщение с просьбой поделиться моим решением. Прошло много времени, но я все равно выложу. В общем, как здесь ранее упоминал, устанавливаем атрибут -silent для armor, чтобы не появлялось сообщение об отсутствии ключа. Важный момент, что в моем случае необходимо было при извлечении ключа сразу закрыть соединение с БД, после вставки ключа - восстановить соединение.
Привожу код в DELPHI:

//объявление функции
procedure WMDeviceChange(var Msg: TMessage); message WM_DEVICECHANGE;

//реализации функции
procedure TMainForm.WMDeviceChange(var Msg: TMessage);
var
    isFound:Boolean;
    dialogResult:Integer;
const
    dialogNoResult=7;
begin
  if(not FindKeyAfterLogin()) then
  begin
     isFound:=false;
     MainDb.CloseDbConnect();
     while not isFound do
     begin
     dialogResult:=MessageBox(Self.Handle,'Вставьте ключ в usb-порт для продолжения работы программы!',
                           ' ��������!', MB_OKCANCEL  or MB_ICONWARNING or MB_DEFBUTTON2 or MB_APPLMODAL);
      if  dialogResult = dialogNoResult then
          Application.Terminate;
      if FindKeyAfterLogin() then
      begin
          isFound:=True;
             MainDb.ReopenDbConnect();
      end;
     end;
   end;
end;

//вспомогательная функция для определения наличия ключа в usb-порту
function FindKeyAfterLogin() : Boolean;
var
    nRet: integer;           
begin
{$IFDEF GRD_ADMIN} LogWrite('Check key: ');{$ENDIF}
  nRet:= GrdCheck (hGrd);
  if(nRet = GrdE_OK) then
  begin
    Result := true;
  end  else
  begin
    Result := false;
  end;
{$IFDEF GRD_ADMIN}  PrintCode(nRet); {$ENDIF}
end;

Re: Реализация события при отключении (извлечении) ключа из usb-порта

Marik Decide, спасибо что поделились!