首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使C++循环在按键上运行,但每次起飞时都中断。

如何使C++循环在按键上运行,但每次起飞时都中断。
EN

Stack Overflow用户
提问于 2017-10-03 04:51:46
回答 2查看 1.2K关注 0票数 0

我有一个C++程序,我正在为我的一款游戏编写,当我按mouse1时,它只会移动鼠标。这是一个外部的反后坐力功能,移动鼠标在一个模式。我想要完成的是让was循环不断地运行,检查按键的状态,看看是否按下了mouse1。一旦它被压过。我有代码要执行,直到mouse1发布。任何帮助都将不胜感激。我现在的职能是:

代码语言:javascript
复制
void ak()
{
    while ((ak) && (GetKeyState(VK_LBUTTON) < 0)) {
        Sleep(50);
        mouse_event(MOUSEEVENTF_MOVE, -4 / humanizer*modifier, 7 / humanizer*modifier, 4, 99 / waitdivider);
        Sleep(50);
        mouse_event(MOUSEEVENTF_MOVE, -4 / humanizer*modifier, 7 / humanizer*modifier, 4, 99 / waitdivider);
        Sleep(50);
        mouse_event(MOUSEEVENTF_MOVE, -4 / humanizer*modifier, 7 / humanizer*modifier, 4, 99 / waitdivider); 

等等。

基本上是一种后坐力补偿。我希望代码只在mouse1按下时才能遍历每一个鼠标事件。所以,如果我是在游戏中,并按住mouse1 3秒。它只执行3秒的代码,然后重置,等待我再次按下它。我希望我能尽量清楚。我基本上想要学习这个逻辑的未来项目无论如何,所以我可以做这种类型的循环。

EN

回答 2

Stack Overflow用户

发布于 2017-10-03 11:24:37

代码语言:javascript
复制
while ((ak) && (GetKeyState(VK_LBUTTON) < 0)) {

ak是函数的指针,保证它不等于0,因此没有点检查它是否等于0。

只有在定期读取消息队列时才更新GetKeyState的结果。就您的情况而言,GetAsyncKeyState函数会更好。但是,如果

前台线程属于另一个进程,桌面不允许挂钩或日志记录。

嵌套时间循环:

代码语言:javascript
复制
while ( true ) // TODO: better think about gracefully leaving this loop
{
    while ( GetAsyncKeyState( VK_LBUTTON ) & 0x8000 )
    {
        // TODO: your code
    }
    // TODO: sleep a little here also
}
票数 0
EN

Stack Overflow用户

发布于 2017-10-03 18:21:41

要在Daniel的回答中添加一些注释,以及您预先准备好的逻辑(如果我正确理解您期望的内容)是:

编辑:裁剪不相关的代码,并提供更新的代码

代码语言:javascript
复制
// Returns TRUE/FALSE if that key is down currently
BOOL get_key_state(UINT key)
{
    return static_cast<BOOL>(GetAsyncKeyState(key) & 0x8000);
}

// your recoil simulating function
void simulate_recoil_on_keydown(UINT key)
{
    // keys hard coded here instead of inside the caller (i.e. WM_KEYDOWN)
    const UINT key_shoot = VK_LBUTTON;
    const UINT key_ak = VK_F1;

    if(key == key_ak)
    {
        while(TRUE)
        {
            mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);

            Sleep(50);

            if(!get_key_state(key_shoot))
            {
                break;
            }

            move(-4/humanizer*modifier, 7/humanizer*modifier, 4, 99/waitdivider);

            if(!get_key_state(key_shoot))
            {
                break;
            }

            move(4/humanizer*modifier, 19/humanizer*modifier, 4, 99/waitdivider);

            if(!get_key_state(key_shoot))
            {
                break;
            }

            move(-3/humanizer*modifier, 29/humanizer*modifier, 4, 99/waitdivider);

            if(!get_key_state(key_shoot))
            {
                break;
            }

            move(-1/humanizer*modifier, 31/humanizer*modifier, 4, 99/waitdivider);

            if(!get_key_state(key_shoot))
            {
                break;
            }

            move(13/humanizer*modifier, 31/humanizer*modifier, 4, 99/waitdivider);

            if(!get_key_state(key_shoot))
            {
                break;
            }

            move(8/humanizer*modifier, 28/humanizer*modifier, 4, 99/waitdivider);

            if(!get_key_state(key_shoot))
            {
                break;
            }

            move(13/humanizer*modifier, 21/humanizer*modifier, 4, 99/waitdivider);

            if(!get_key_state(key_shoot))
            {
                break;
            }

            move(-17/humanizer*modifier, 12/humanizer*modifier, 4, 99/waitdivider);

            if(!get_key_state(key_shoot))
            {
                break;
            }

            move(-42/humanizer*modifier, -3/humanizer*modifier, 4, 99/waitdivider);

            if(!get_key_state(key_shoot))
            {
                break;
            }

            move(-21/humanizer*modifier, 2/humanizer*modifier, 4, 99/waitdivider);

            if(!get_key_state(key_shoot))
            {
                break;
            }

            move(12/humanizer*modifier, 11/humanizer*modifier, 4, 99/waitdivider);

            if(!get_key_state(key_shoot))
            {
                break;
            }

            move(-15/humanizer*modifier, 7/humanizer*modifier, 4, 99/waitdivider);

            if(!get_key_state(key_shoot))
            {
                break;
            }

            move(-26/humanizer*modifier, -8/humanizer*modifier, 4, 99/waitdivider);

            if(!get_key_state(key_shoot))
            {
                break;
            }

            move(-3/humanizer*modifier, 4/humanizer*modifier, 4, 99/waitdivider);

            if(!get_key_state(key_shoot))
            {
                break;
            }

            move(40/humanizer*modifier, 1/humanizer*modifier, 4, 99/waitdivider);

            if(!get_key_state(key_shoot))
            {
                break;
            }

            move(19/humanizer*modifier, 7/humanizer*modifier, 4, 99/waitdivider);

            if(!get_key_state(key_shoot))
            {
                break;
            }

            move(14/humanizer*modifier, 10/humanizer*modifier, 4, 99/waitdivider);

            if(!get_key_state(key_shoot))
            {
                break;
            }

            move(27/humanizer*modifier, 0/humanizer*modifier, 4, 99/waitdivider);

            if(!get_key_state(key_shoot))
            {
                break;
            }

            move(33/humanizer*modifier, -10/humanizer*modifier, 4, 99/waitdivider);

            if(!get_key_state(key_shoot))
            {
                break;
            }

            move(-21/humanizer*modifier, -2/humanizer*modifier, 4, 99/waitdivider);

            if(!get_key_state(key_shoot))
            {
                break;
            }

            move(7/humanizer*modifier, 3/humanizer*modifier, 4, 99/waitdivider);

            if(!get_key_state(key_shoot))
            {
                break;
            }

            move(-7/humanizer*modifier, 9/humanizer*modifier, 4, 99/waitdivider);

            if(!get_key_state(key_shoot))
            {
                break;
            }

            move(-8/humanizer*modifier, 4/humanizer*modifier, 4, 99/waitdivider);

            if(!get_key_state(key_shoot))
            {
                break;
            }

            move(19/humanizer*modifier, -3/humanizer*modifier, 4, 99/waitdivider);

            if(!get_key_state(key_shoot))
            {
                break;
            }

            move(5/humanizer*modifier, 6/humanizer*modifier, 4, 99/waitdivider);

            if(!get_key_state(key_shoot))
            {
                break;
            }

            move(-20/humanizer*modifier, -1/humanizer*modifier, 4, 99/waitdivider);

            if(!get_key_state(key_shoot))
            {
                break;
            }

            move(-33/humanizer*modifier, -4/humanizer*modifier, 4, 99/waitdivider);

            if(!get_key_state(key_shoot))
            {
                break;
            }

            move(-45/humanizer*modifier, -21/humanizer*modifier, 4, 99/waitdivider);

            if(!get_key_state(key_shoot))
            {
                break;
            }

            move(-14/humanizer*modifier, 1/humanizer*modifier);

            if(!get_key_state(key_shoot))
            {
                break;
            }

            Sleep(80);

            mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);

            Sleep(1000);

            // Following is not required
            //if(!get_key_state(key_shoot))
            //{
            //  break;
            //}

        }

        mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
    }
}

你的WndProc应该有这样的电话:

代码语言:javascript
复制
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_KEYDOWN:
        simulate_recoil_on_keydown(wParam);
        return 0;

    // other case statements that you may already have

    }
}

保持上面的代码操作简单,有足够的空间进行完全重构。

如果不像预期的那样工作,请使用,如果有,请共享函数的其余部分,如果可能的话,请提供清晰的伪代码!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46537420

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档