我正在用C ++制作一个简单的宏观点击器。到目前为止我有一个简单的程序。所有它有2个按钮,说"激活"和"停用"分别为:
我的程序的主要部分是switch(messages)
函数:
bool i = false;
switch (message)
{
case WM_CREATE:
CreateWindow(
TEXT("button"),TEXT("Activate"),
WS_VISIBLE | WS_CHILD,
25,
30,
100,
50,
hwnd, (HMENU) 1, NULL, NULL
);
CreateWindow(
TEXT("button"),TEXT("Deactivate"),
WS_VISIBLE | WS_CHILD,
150,
30,
100,
50,
hwnd, (HMENU) 2, NULL, NULL
);
break;
case WM_COMMAND:
if(LOWORD(wParam) == 1){
i = true;
while(i == true)
{
if(GetKeyState(0x43) & 0x8000)
{
usleep(13625);
mouse_event(MOUSEEVENTF_LEFTDOWN, NULL, NULL, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, NULL, NULL, 0, 0);
}
}
}
if(LOWORD(wParam) == 2){
i = false;
}
break;
case WM_DESTROY:
PostQuitMessage (0);
break;
default:
return DefWindowProc (hwnd, message, wParam, lParam);
}
while(i == true)
循环是点击循环,当"激活"按下按钮。循环检查是否保持C
键,如果为true,它将非常快速地点击。出于某种原因,只要"激活"按下按钮。
我有一个工作的宏Clicker,但我对它不满意,因为它使用命令提示符窗口和cout << "Clicking Queued";
作为接口。
如果有人能告诉我出了什么问题以及如何解决问题,我们将不胜感激。
-Thanks
答案 0 :(得分:2)
您的代码正在运行无限循环,阻止应用程序的UI消息循环处理新消息,从而阻止“取消激活”按钮被单击,并阻止GetKeyState()
更新调用线程的本地密钥状态信息。该应用程序没有崩溃,它只是没有响应操作系统。
永远不会阻止UI线程处理邮件。
此代码需要重写。
单击“激活”按钮时(或当您收到WM_KEYDOWN
键的C
消息时),请改为启动计时器或工作线程,然后退回到UI消息循环。让计时器/线程根据需要提交鼠标事件(您应该使用SendInput()
而不是mouse_event()
)。
单击“取消激活”按钮时(或当您收到WM_KEYUP
键的C
消息时),请停止计时器/线程。
例如:
LRESULT WINAPI MyWindowProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_CREATE:
CreateWindow(
TEXT("button"),TEXT("Activate"),
WS_VISIBLE | WS_CHILD,
25,
30,
100,
50,
hwnd, (HMENU) 1, NULL, NULL
);
CreateWindow(
TEXT("button"),TEXT("Deactivate"),
WS_VISIBLE | WS_CHILD,
150,
30,
100,
50,
hwnd, (HMENU) 2, NULL, NULL
);
break;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case 1:
SetTimer(hwnd, 1, 13, NULL);
break;
case 2:
KillTimer(hwnd, 1);
break;
}
break;
case WM_TIMER:
if (GetKeyState(0x43) & 0x8000)
{
/*
mouse_event(MOUSEEVENTF_LEFTDOWN, NULL, NULL, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, NULL, NULL, 0, 0);
*/
INPUT inputs[2] = {0};
inputs[0].type = INPUT_MOUSE;
inputs[0].mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
inputs[1].type = INPUT_MOUSE;
inputs[1].mi.dwFlags = MOUSEEVENTF_LEFTUP;
SendInput(2, inputs, sizeof(INPUT));
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, message, wParam, lParam);
}
return 0;
}