O clique automático mais rápido para Windows PC. 100000 cliques por segundo alcançado por Win32 SendInput(). GUI, linha de comando, sequências de registro/jogo de cliques
Baixe a versão mais recente : 2.6.2.0
( espelho ) - ler AlterarORegisto
Github:
175
, 33
, 51465067
( Gitlab )
Atualizado : Junho 11 2025
Mapa do site
Atualizado : Junho 11 2025.
Ao contrário de outros clicadores automáticos que usam a chamada de sistema obsoleta mouse_event()
de código fonte C/C++ ou SendInput()
não-array de código fonte C#/.Net, o Clicker de Mouse Mais Rápido para Windows usa
array SendInput()
com matrizes de eventos do mouse:
UINT nCntExtra = (nCnt - 1) * 2; // índice reservado para BAIXO, CIMA
for (UINT iExtra = 0; iExtra < nCntExtra; iExtra += 2)
{
input[1 + iExtra].type = INPUT_MOUSE;
input[1 + iExtra].mi.dx = dx;
input[1 + iExtra].mi.dy = dy;
input[1 + iExtra].mi.mouseData = dwData;
input[1 + iExtra].mi.time = 0;
input[1 + iExtra].mi.dwExtraInfo = dwExtraInfo;
...
}
...
UINT ret = SendInput(1 + nCntExtra, input, sizeof(INPUT));
O tamanho dos arrays é cuidadosamente calculado com base na taxa de cliques fornecida pelo usuário final. Para evitar estouro do buffer de eventos do sistema,
o tempo em Sleep()
é selecionado corretamente de acordo com o tamanho do array.
A interface gráfica do usuário (GUI) do aplicativo parece arcaica, mas é feita por chamadas de sistema Win32 muito básicas para evitar degradação de desempenho causada por bibliotecas de terceiros de alto nível, como Qt ou código gerenciado lento em frameworks como C#/.Net.
Por exemplo, GetAsyncKeyState()
é usado para detectar as teclas de gatilho pressionadas pelo usuário final:
if (!doToggle)
{
if (toggleState == 0 && GetAsyncKeyState(atoi(triggerText)))
toggleState = 1;
...
}
else
{
if (toggleState == 0 && GetAsyncKeyState(atoi(triggerText)))
toggleState = 1;
...
}
Outro benefício dessa abordagem é um executável compacto, estaticamente vinculado e sem dependências externas.
Quando o usuário final seleciona baixas taxas de cliques, o tamanho real da matriz de eventos do mouse em SendInput()
é definido como 1 e o número de cliques por segundo é regulado apenas por Sleep()
.
Mas quando o usuário final seleciona altas taxas de cliques, o tamanho da matriz se torna significativo. Em raras circunstâncias, isso pode levar ao congelamento de toda a interface gráfica do usuário (GUI) do Windows.
Para evitar isso, a thread auxiliar é criada para escanear GetAsyncKeyState()
independentemente, para que o usuário final solicite a interrupção do clique
e forçar BlockInput()
, pois o buffer de eventos do mouse pode estar cheio:
DWORD WINAPI MyThreadFunction(LPVOID lpParam)
{
while (true)
{
if (GetAsyncKeyState(atoi(triggerText2)))
{
...
BlockInput(TRUE);
Sleep(100);
BlockInput(FALSE);
...
SetMsgStatus(hWnd, GetDlgCtrlID(statusText)
, "idle");
}
Sleep(10);
}
return 0;
}
Para ser mais compatível com versões mais antigas do Windows, O Mais Rápido Mouse Clicker para Windows utiliza a API base do Win32 para a criação de widgets. Ele usa a abordagem tradicional do Windows para redesenhar todos os widgets em um loop de eventos do Windows. Para atualizar a visualização de um widget específico, um evento é enviado para esse widget na thread principal e a chamada de entrada é passada para o manipulador do loop de eventos, onde o redesenho real ocorre.
Primeiro, declaramos uma função de retorno de chamada WindowProc()
.
Em segundo lugar, registramos uma classe de janela principal com esse retorno de chamada por RegisterClassA()
.
E, finalmente, entramos em um loop infinito dentro da função de retorno de chamada de evento.
LRESULT CALLBACK winCallBack(
HWND hWin
, UINT msg
, WPARAM wp
, LPARAM lp
);
...
// Inicializando a classe de janela
windClass.style = CS_HREDRAW | CS_VREDRAW;
windClass.lpfnWndProc = winCallBack;
windClass.cbClsExtra = 0;
windClass.cbWndExtra = 0;
windClass.hInstance = instanceH;
windClass.hIcon = LoadIcon(
windClass.hInstance
, MAKEINTRESOURCE(101)
);
windClass.hCursor = LoadCursor(
NULL
, IDC_ARROW
);
windClass.hbrBackground = (HBRUSH)GetStockObject(
WHITE_BRUSH
);
windClass.lpszClassName = "O mouse mais rápido para Windows"
//Registrando a classe de janela
RegisterClass(&windClass);
...
RETORNO DE CHAMADA LRESULT winCallBack(
HWND hWin
, UINT msg
, WPARAM wp
, LPARAM lp
)
{
HDC dc;
PAINTSTRUCT ps;
int status_local = 0;
switch (msg)
{
case WM_COMMAND:
switch(LOWORD(wp))
{
case RESET_BTN:
...
...
}
Por outro lado, para maior compatibilidade com as versões mais recentes do Windows e hardwares mais recentes, como monitores profissionais 4K e monitores gamer, o ajuste do tamanho da fonte é realizado na inicialização do aplicativo, utilizando tamanho de fonte variável e manifesto XML incorporado high DPI.
struct _Sc
{
int factor;
_Sc() : fator(1)
{
int h, v;
ObterResoluçãoDeDesktop(h, v);
if (v > 1440)
fator = 2;
}
} _sc;
int Sc(int x)
{
return x * _sc.fator;
}
...
statusText = CreateWindow(
"Estático"
, "status do clique: inativo"
, WS_VISIBLE | WS_CHILD
, Sc(5)
, Sc(1)
, Sc(410)
, Sc(35)
, hWnd
, 0
, 0
, 0
);
O manifesto XML incorporado do aplicativo contém uma seção com alta percepção de DPI.
...
<asmv3:application>
<asmv3:windowsSettings>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
true
</dpiAware>
<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">
system
</dpiAwareness>
</asmv3:windowsSettings>
</asmv3:application>
...
Há muitos outros truques programáticos que usei para obter desempenho, compatibilidade e aparência excelentes. Se você quiser descobri-los, terá que estudar o código-fonte por si mesmo.