如何在按键时保持C ++循环运行,但每次升空都要打破它

时间:2017-10-03 04:51:46

标签: c++ loops winapi

我有一个C ++程序即可为我的一个游戏编写,当我按下mouse1时只会将鼠标移动。它是一种外部防反冲功能,可以将鼠标向下移动一个模式。我想要完成的是有一个while循环不断运行,检查按键的状态以查看是否按下了mouse1。一旦被按下。我有代码,我想执行UNTIL mouse1被释放。任何帮助将非常感激。我现在拥有的功能是

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时才能遍历每个mouse_event。因此,如果我在游戏中并将鼠标1按下3秒钟。它只会执行3秒钟的代码,然后重置等待我再次按下它。我希望我尽可能地清楚。我基本上想要为未来的项目学习这个逻辑,所以我可以做这种类型的循环。

&lt; 3感谢任何人的帮助。

2 个答案:

答案 0 :(得分:0)

ak

GetKeyState是一个指向函数的指针,它保证不等于0,因此没有必要检查它是否等于0.

while ( true ) // TODO: better think about gracefully leaving this loop { while ( GetAsyncKeyState( VK_LBUTTON ) & 0x8000 ) { // TODO: your code } // TODO: sleep a little here also } 的结果仅在您定期阅读邮件队列时更新。在你的情况下,GetAsyncKeyState function会更好。但是,如果

,它将无法使用
  

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

嵌套while循环:

export class ComponentOne {
  constructor(loaderService: LoaderService, orderService: OrderService) {}
  ...
  ...
  method() {
    this.loaderService.display(true);
    this.orderService.firstRequest()
      // the misspelled word causes a 500 error
      .then((response) => this.orderService.methodWithWrongInput('misspelled_word'))
      // but it still executes the following then
      .then(() => this.method2())
      .catch(() => null)
      .then(() => this.loaderService.display(false));
  }
  ...
}

答案 1 :(得分:0)

添加一些评论,并将您的预煮逻辑添加到Daniel的答案中(如果我正确理解您的期望):

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

// 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应该有这样的电话:

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

    }
}

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

如果这不能按预期工作,请分享剩余的功能,如果可能的话,请提供明确的伪代码!

相关问题