如何使用按钮C ++激活while()语句

时间:2017-05-10 21:53:07

标签: c++ windows winapi

我正在用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

1 个答案:

答案 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;
}