“Access denied” ou “A call to an OS function failed”

Se você está desenvolvendo alguma aplicação relativamente simples no Delphi e está recebendo a mensagem “Access denied code 5” ou “A call to an OS function failed” deve saber que o erro é mais fácil de ser solucionado do que parece.

Depois de pesquisar por alguns minutos (30 a 40 minutos) vi em alguns fóruns que este erro normalmente ocorre em estações de trabalho com Windows Vista ou superior que estão com a função “Ao continuar, proteger com senha” nas opções de Proteção de tela. Também ocorrem anomalias em conexões da Área de trabalho remota, cuja janela é iniciada em tela cheia e clicamos no ícone de Restaurar para podermos manipular nossa área de trabalho local.

A rotina que está dando erro é a função GetCursorPos da classe o TMouse onde, internamente, ela faz uma verificação de sistema operacional que resulta no erro:

function TMouse.GetCursorPos: TPoint;
begin
  {$WARN SYMBOL_PLATFORM OFF}
  Win32Check(Windows.GetCursorPos(Result));
  {$WARN SYMBOL_PLATFORM ON}
end;

A solução veio diretamente do site da Embarcadero no link http://qc.embarcadero.com/wc/qcmain.aspx?d=9344. Lá diz para usar diretamente a API do Windows, eliminando o erro e, no meu caso, salvando o sistema de aviso de agenda da possível extinção. A implementação também não é complicada de se fazer, basta trocar o Mouse.CursorPos.X pelo código abaixo:

procedure TForm1.BitBtn1Click(Sender: TObject);
var
  MousePos: TPoint;
begin
  if Windows.GetCursorPos(MousePos) then
    ShowMessage('O mouse está na posição X: '+IntToStr(MousePos.Left))
  else
    ShowMessage('Não foi possível obter a posição do mouse.');
end;

Conclusão
Depois de alguns testes e muita pesquisa agora você pode bloquear a tela, dar ALT+TAB na conexão remota que o erro desaparece.