【发布时间】:2020-05-07 15:51:32
【问题描述】:
我正在尝试制作一个执行此操作的程序(C#):
- 如果我单击鼠标左键,鼠标应该向左移动一个 DeltaX。
问题是,当我运行程序时,它只是打开了控制台应用程序,但没有任何反应。我不确定我在这里做错了什么。 它应该继续运行并检查我是否单击鼠标左键,当我单击它时,光标应该向左移动一个 DeltaX。
代码
using System.Data;
using System.Runtime.InteropServices;
using System.Threading;
using System.Threading.Tasks;
namespace Teste
{
class Program
{
static void Main(string[] args)
{
var someClass = new Up();
someClass.Update();
}
}
public class Up
{
[DllImport("user32.dll")] static extern short GetAsyncKeyState(int vKey);
[DllImport("USER32.dll")] static extern short GetKeyState(int nVirtKey);
int msShootTime = 225;
System.DateTime lastClick = System.DateTime.Now;
bool isRunning = true;
public async void Update()
{
while (true)
{
if (isRunning)
{
await Task.Delay(10);
continue;
}
int res = GetKeyState((int)1);
if (res >= 0)
{
await Task.Delay(1);
continue;
}
Move(-10, 0, true);
}
}
private const int MOUSEEVENTF_LEFTDOWN = 0x02;
private const int MOUSEEVENTF_LEFTUP = 0x04;
private const int MOUSEEVENTF_RIGHTDOWN = 0x08;
private const int MOUSEEVENTF_RIGHTUP = 0x10;
[DllImport("user32.dll")]
static extern void mouse_event(int dwFlags, int dx, int dy, uint dwData, UIntPtr dwExtraInfo);
public void Move(int xDelta, int yDelta, bool pressDown = false)
{
if (pressDown)
{
if (System.DateTime.Now.Subtract(lastClick).TotalMilliseconds < msShootTime)
{
pressDown = false;
}
else
{
lastClick = System.DateTime.Now;
}
}
mouse_event(pressDown ? (MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP) : 0x0001, xDelta, yDelta, 0, UIntPtr.Zero);
}
}
}
【问题讨论】:
-
您似乎对应用程序类型有一个根本性的误解。控制台应用程序不允许您响应鼠标点击(至少不容易)。您需要一个 GUI 应用程序。然后您将能够响应鼠标点击。你没有说你在什么环境下运行,所以很难给你任何进一步的方向。
-
@Optimax GetAsyncKeyState() 将允许在此处检测鼠标点击(并通过
mouse_event移动鼠标指针(而不是插入符号))。但是isRunning有点毁了一切。然后,由于当鼠标按钮按下时,该函数返回一个SHORT(不是C#short:),res永远不会是> 0,但它几乎总是=0,所以鼠标指针会不断移动(当isRunning不在图片中时)。 -
@Jimi 我说“容易”。我希望“伪 GUI”控制台应用程序成为过去。 OP没有说必须使用控制台。这看起来也是一个非常人为的问题。就像作业一样,也许......
-
@Optimax 这看起来像是一个测试,也许是为了了解这一切如何运作,我不能说。无论如何,只需进行一些更改(如所述),它就可以工作。
-
我忘了说
someClass.Update();调用应该改成Task.Run(() => someClass.Update());
标签: c#