gpt4 book ai didi

c# - SendInput 在 pc 的水果忍者中被阻止

转载 作者:太空宇宙 更新时间:2023-11-03 10:58:53 28 4
gpt4 key购买 nike

我正在编写一个程序,该程序使用 SendInput 函数来模拟鼠标事件以在 PC 上玩水果忍者。但是当我调用 SendInput 时,鼠标移动了,但游戏屏幕上没有任何反应。谁能告诉我为什么它不起作用并给我一些解决方案?我在 C# 上编程并使用 [dllimport] 调用 SendInput 函数。谢谢。

最佳答案

我建议您只模拟鼠标移动。您应该模拟鼠标拖动。首先执行 mouse down -> mouse move -> mouse up

这里是我旧项目的一些代码:

namespace Clicker.Enums
{
public enum MouseEvents
{
MOVE = 0x0001, /* mouse move */
LEFTDOWN = 0x0002, /* left button down */
LEFTUP = 0x0004, /* left button up */
RIGHTDOWN = 0x0008, /* right button down */
RIGHTUP = 0x0010, /* right button up */
MIDDLEDOWN = 0x0020, /* middle button down */
MIDDLEUP = 0x0040, /* middle button up */
XDOWN = 0x0080, /* x button down */
XUP = 0x0100, /* x button down */
WHEEL = 0x0800, /* wheel button rolled */
VIRTUALDESK = 0x4000, /* map to entire virtual desktop */
ABSOLUTE = 0x8000 /* absolute move */
}
}

namespace Clicker.Actions
{
public class Action
{
protected int x;
protected int y;

...

[DllImport("user32")]
protected static extern int SetCursorPos(int x, int y);

[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
protected static extern void mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);

...

public int X { get { return x; } set { x = value; } }
public int Y { get { return y; } set { y = value; } }

...

public vritual void PerformAction()
{

}

...
}
}

namespace Clicker.Actions
{
public class Drag : Action
{
public int To_X { get; set; }
public int To_Y { get; set; }

...

public override void PerformAction()
{
SetCursorPos(X, Y);
Thread.Sleep(100);
mouse_event((int)MouseEvents.LEFTDOWN, 0, 0, 0, 0);
SetCursorPos(To_X, To_Y);
Thread.Sleep(100);
mouse_event((int)MouseEvents.LEFTUP, 0, 0, 0, 0);
}

...
}
}

使用:

Action sliseFruit = new Drag(){ 
X = 0, // from (X=0, Y=0)
Y = 0, // from (X=0, Y=0)
To_X = 100, // to (X=100, Y=100)
To_Y = 100, // to (X=100, Y=100)
};

sliseFruit.PerformAction();

这里有一些更多的建议:如果您想在应用程序的主窗体之外单击,问题也可能出在 SynchronizationContext 和/或 Threading 中。可能的解决方案:

namespace Clicker.Actions
{
public class Action
{
protected int x;
protected int y;

// Add this fields
private static SynchronizationContext _context = null;
public static SynchronizationContext Context { get { return _context; } set { _context = value; } }

...

[DllImport("user32")]
protected static extern int SetCursorPos(int x, int y);

[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
protected static extern void mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);

...

public int X { get { return x; } set { x = value; } }
public int Y { get { return y; } set { y = value; } }

...

// ... and this method
internal virtual void InnerPerformAction(object state)
{
return;
}

// change PerformAction like this
public void PerformAction()
{
InnerPerformAction(new object());
}

...
}
}

现在编辑拖动操作类:

namespace Clicker.Actions
{
public class Drag : Action
{
public int To_X { get; set; }
public int To_Y { get; set; }

...

internal override void InnerPerformAction(object state)
{
try
{
Context.Send(new SendOrPostCallback(delegate
{
SetCursorPos(X, Y);
Thread.Sleep(100);
mouse_event((int)MouseEvents.LEFTDOWN, 0, 0, 0, 0);
SetCursorPos(To_X, To_Y);
Thread.Sleep(100);
mouse_event((int)MouseEvents.LEFTUP, 0, 0, 0, 0);
}), state);

}
catch
{
//Aaaaahh... what ever...
}
}

...
}
}

差点忘了:

// You have to do this in your main form constructor
Action.Context = SynchronizationContext.Current;

我刚刚使用这段代码创建了简单的解决方案,并且运行良好。如果需要,我可以通过电子邮件或其他方式发送给您。

关于c# - SendInput 在 pc 的水果忍者中被阻止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18405990/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com