如何在按键按下C 循环运行,但将其打破每个升降机
How to keep a C++ Loop running on key press but break it every lift-off
我有一个C 程序,我正在为其中一个游戏编写,当我按Mouse1时将鼠标向下移动。这是一种外部抗回归功能,以模式将鼠标向下移动。我要完成的工作是要有一段时间循环不断运行,检查键按下的状态,以查看是否按下了鼠标1。一旦按下。我有要执行的代码,直到释放鼠标1为止。任何帮助将非常感激。我现在拥有的功能是:
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秒钟,然后重置等待我再次按下它。我希望我能尽可能清楚。我基本上想为未来的项目学习这种逻辑,以便我可以做这种类型的循环。
while ((ak) && (GetKeyState(VK_LBUTTON) < 0)) {
ak
是一个函数的指针,保证它不是等于0,因此没有必要检查它不等于0。
仅在定期阅读消息队列时才更新GetKeyState
的结果。在您的情况下,getAsynckeystate功能会更好。但是,如果
前景线程属于另一个过程,桌面不允许挂钩或日志记录。
循环时嵌套:
while ( true ) // TODO: better think about gracefully leaving this loop
{
while ( GetAsyncKeyState( VK_LBUTTON ) & 0x8000 )
{
// TODO: your code
}
// TODO: sleep a little here also
}
添加一些评论,而您对丹尼尔的答案的逻辑(如果我正确理解您的期望)是:
编辑:修剪无关的代码,并提供更新的一个
// 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简单地保持代码,有足够的完整重构空间。
以防万一您不按照您的期望工作,请分享其余功能,或者如果可能的话,请提供清晰的伪代码!
相关文章:
- 运行同一解决方案的另一个项目的项目
- CMake-按正确顺序将项目与C运行时对象文件链接
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- 代码在main()中运行,但在函数中出现错误
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 如何在运行中期切换GTK CSS style_context
- 如何在MS Visual Studio 2019中运行QT UI
- 如何通过cpp程序运行shell脚本
- IPC使用多个管道和分支进程来运行Python程序
- 删除指向指针的指针是运行时错误吗
- 如何用参数值调用函数(仅在运行时已知)
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- c++中的指针和运行时错误
- 在C应用程序中运行C++(带有STL)函数
- 运行程序时出现问题
- 控制允许动态运行c++的并发操作数
- 如何在按键按下C 循环运行,但将其打破每个升降机