Sistema Anti-Bot
Estou Desenvolvendo um Sistema Anti-Bot para um jogo e preciso de ajuda...
Tenho um programa que joda no tray junto com o jogo e nesse programa gostaria de saber se tem algum código que, por exemplo, execute determinados comandos se nada no teclado ou mouse acontecer dentro de um determinado periodo de tempo, 20 segundos que seja.
Ou Seja, se nenhum botão for apertado ou mouse mechido dentro de 20 segundos, ele irá executar um dos meus comandos, utilizando um sistema parecido com o da proteção de tela, se possivel...
é Possivel ?
Tenho um programa que joda no tray junto com o jogo e nesse programa gostaria de saber se tem algum código que, por exemplo, execute determinados comandos se nada no teclado ou mouse acontecer dentro de um determinado periodo de tempo, 20 segundos que seja.
Ou Seja, se nenhum botão for apertado ou mouse mechido dentro de 20 segundos, ele irá executar um dos meus comandos, utilizando um sistema parecido com o da proteção de tela, se possivel...
é Possivel ?
Czao
Curtidas 0
Respostas
Bononi
31/08/2008
Bliblioteca de funções para capturar mouse e teclado globalmente (nomes sugeridos : Hookme, CapitainHook, TheHook, etc...)
uses
Windows, Messages, SysUtils;
{Define um record para gravar e passar a informação para o sistema globalmente}
type
PHookRec = ^ THookRec;
THookRec = Packed Record
TheHookHandle: HHOOK;
TheAppWinHandle: HWnd;
TheCtrlWinHandle: HWnd;
TheKeyCount: DWord;
end;
var
hObjHandle : THandle; {Variavel para mapear o objeto}
lpHookRec : PHookRec;
{Pointer para nosso registro}
procedure MapFileMemory (dwAllocSize: DWord);
begin { MapeaArqMemoria }
{Cria uma variavel para mapear o processo globalmente}
hObjHandle := CreateFileMapping ($FFFFFFFF, Nil, PAGE_READWRITE, 0,
dwAllocSize, ´HookRecMemBlock´);
if (hObjHandle = 0) then
begin
MessageBox (0, ´Hook DLL´, ´Não foi possivel criar objeto para mapear o arquivo´, mb_Ok);
exit
end { (hObjHandle = 0) };
{Pointer para a nossa variavel global}
lpHookRec := MapViewOfFile (hObjHandle, FILE_MAP_WRITE, 0, 0, dwAllocSize);
if (lpHookRec = Nil) then
begin
CloseHandle (hObjHandle);
MessageBox (0, ´Hook DLL´, ´Não é possível mapear o objeto´, mb_Ok);
exit
end { (lpHookRec = Nil) }
end; { MapeArqMemoria }
procedure UnMapFileMemory;
begin { DesMapArqMemoria }
{Delete o processo}
if (lpHookRec <> Nil) then
begin
UnMapViewOfFile (lpHookRec);
lpHookRec := Nil
end { (lpHookRec <> Nil) };
if (hObjHandle > 0) then
begin
CloseHandle (hObjHandle);
hObjHandle := 0
end { (hObjHandle > 0) }
end; { DesMapArqMemoria }
function GetHookRecPointer : pointer
stdcall;
begin { PegaHookRegPointer }
{Return a pointer to our process wide memory mapped variable}
Result := lpHookRec
end; { PegaHookRegPointer }
{A função que realmente processa a captura do teclado}
function KeyBoardProc (code: Integer; wParam: Integer; lParam: Integer) :
Integer;
stdcall;
var
KeyUp : bool;
{Remova os commentários para melhorar a funcionalidade
IsAltPressed : bool;
IsCtrlPressed : bool;
IsShiftPressed : bool;
}
begin { KeyBoardProc }
Result := 0;
Case code Of
HC_ACTION:
begin
{Capturamos as mensagens aqui}
{Seria uma mensagem "key up"?}
KeyUp := ((lParam and (1 shl 31)) <> 0);
(*Remova os commentários para melhorar a funcionalidade
{Alt foi apertada?}
if ((lParam and (1 shl 29)) <> 0) then begin
IsAltPressed := TRUE;
end else begin
IsAltPressed := FALSE;
end;
{Ctrl foi apertada?}
if ((GetKeyState(VK_CONTROL) and (1 shl 15)) <> 0) then begin
IsCtrlPressed := TRUE;
end else begin
IsCtrlPressed := FALSE;
end;
{Shift foi apertada?}
if ((GetKeyState(VK_SHIFT) and (1 shl 15)) <> 0) then begin
IsShiftPressed := TRUE;
end else begin
IsShiftPressed := FALSE;
end;
*)
{Se sim incrementa o contador}
if (KeyUp <> false) then
begin
inc (lpHookRec^.TheKeyCount)
end { (KeyUp <> false) };
Case wParam Of
{Enter pressionada?}
VK_RETURN:
begin
{if KeyUp}
if (KeyUp <> false) then
begin
{Manda uma mensagem falsa para a aplicação...}
PostMessage (lpHookRec^.TheCtrlWinHandle, WM_KEYDOWN, 0, 0);
PostMessage (lpHookRec^.TheCtrlWinHandle, WM_KEYUP, 0, 0)
end { (KeyUp <> false) };
{se quiser "engolir" a tecla pressionada retorne -1}
{senão retorne 0}
Result := 0;
exit
end;
{se a tecla "para a esquerda" foi pressionada, vamos brincar!}
VK_LEFT:
begin
{if KeyUp}
if (KeyUp <> false) then
begin
{Create a UpArrow keyboard event}
keybd_event (VK_RIGHT, 0, 0, 0);
keybd_event (VK_RIGHT, 0, KEYEVENTF_KEYUP, 0)
end { (KeyUp <> false) };
{engole a tecla}
Result := -1;
exit
end;
end { case wParam }; {case wParam}
{Allow the keystroke}
Result := 0
end;
HC_NOREMOVE:
begin
{Esta é uma mensagem do teclado, mas a mensagem não foi
removida da fila, porque uma aplicação chamou PeekMessage() com
atributo PM_NOREMOVE}
Result := 0;
exit
end;
end { case code }; {case code}
if (code < 0) then
{Próxima captura na fila}
Result := CallNextHookEx (lpHookRec^.TheHookHandle, code, wParam, lParam)
end; { KeyBoardProc }
procedure StartKeyBoardHook
stdcall;
begin { StartKeyBoardHook }
{Se temos uma variavel global na memória
e a captura ainda não foi iniciada}
if ((lpHookRec <> Nil) and (lpHookRec^.TheHookHandle = 0)) then
begin
{Inicie a captura e guarde o handle}
lpHookRec^.TheHookHandle := SetWindowsHookEx (WH_KEYBOARD, @KeyBoardProc,
HInstance, 0)
end { ((lpHookRec <> Nil) and (lpHookRec^.TheHookHandle = 0)) }
end; { StartKeyBoardHook }
procedure StopKeyBoardHook
stdcall;
begin { StopKeyBoardHook }
{Se temos uma variavel global na memória
e a captura já foi inciada}
if ((lpHookRec <> Nil) and (lpHookRec^.TheHookHandle <> 0)) then
begin
{Retira a captura e limpe o handle}
if (UnHookWindowsHookEx (lpHookRec^.TheHookHandle) <> false) then
begin
lpHookRec^.TheHookHandle := 0
end { (UnHookWindowsHookEx (lpHookRec^.TheHookHandle) <> false) }
end { ((lpHookRec <> Nil) and (lpHookRec^.TheHookHandle <> 0)) }
end; { StopKeyBoardHook }
procedure DllEntryPoint (dwReason: DWord);
begin { DllEntryPoint }
Case dwReason Of
Dll_Process_Attach:
begin
{Se mapeado dentro de um processo, então
pegue um pointer para nossa variavel global}
hObjHandle := 0;
lpHookRec := Nil;
MapFileMemory (sizeof (lpHookRec^))
end;
Dll_Process_Detach:
begin
{Se desmapeado de um processo, remova o pointer
da variavel}
UnMapFileMemory
end;
end { case dwReason }
end; { DllEntryPoint }
Exports
KeyBoardProc name ´KEYBOARDPROC´,
GetHookRecPointer name ´GETHOOKRECPOINTER´,
StartKeyBoardHook name ´STARTKEYBOARDHOOK´,
StopKeyBoardHook name ´STOPKEYBOARDHOOK´;
begin
{Inicia o ponto de entrada da DLL}
DLLProc := @DllEntryPoint;
{Chama o ponto de entrada da DLL}
DllEntryPoint (Dll_Process_Attach)
end.
GOSTEI 0
Czao
31/08/2008
Ok, Vamos com Calma...
1º, com isso eu posso fazer uma DLL, com este código para usar no meu programa ?
Ok, meu delphi encontra um erro em
Se eu retiro essas linhas, o delphi compila a dll.
Depois com a DLL pronta, oq eu faço ?
É Isso ou estou fazendo confusão ??
Preciso de uma Ajuda mais Detalhada, por Favor.
1º, com isso eu posso fazer uma DLL, com este código para usar no meu programa ?
Ok, meu delphi encontra um erro em
StartKeyBoardHook name ´STARTKEYBOARDHOOK´, StopKeyBoardHook name ´STOPKEYBOARDHOOK´;
Se eu retiro essas linhas, o delphi compila a dll.
Depois com a DLL pronta, oq eu faço ?
É Isso ou estou fazendo confusão ??
Preciso de uma Ajuda mais Detalhada, por Favor.
GOSTEI 0