C# 使用回调函数检查鼠标指针状态

C# 使用回调函数检查鼠标指针状态,c#,windows,callback,mouse,C#,Windows,Callback,Mouse,我需要一种可靠的方法来检查鼠标指针的状态,并计算它改变了多少次,例如,从“正常”指针到沙漏/圆或反之亦然。它是测量响应时间的性能测试的一部分,确定某个业务流程是否已完成的唯一方法是观察鼠标指针,并计算它从“正常”到“繁忙”再返回的次数。一旦它这样做了两次,这个过程就完成了。我知道-这很可怕,而且是一个垃圾的解决办法,但这是我唯一可以使用的东西。 我已经实现了一些可以工作的东西,但是它有一个关键的弱点:如果鼠标指针在线程进入睡眠状态时发生变化,那么我“错过”了这个变化,从而错过了退出条件。我会将等

我需要一种可靠的方法来检查鼠标指针的状态,并计算它改变了多少次,例如,从“正常”指针到沙漏/圆或反之亦然。它是测量响应时间的性能测试的一部分,确定某个业务流程是否已完成的唯一方法是观察鼠标指针,并计算它从“正常”到“繁忙”再返回的次数。一旦它这样做了两次,这个过程就完成了。我知道-这很可怕,而且是一个垃圾的解决办法,但这是我唯一可以使用的东西。 我已经实现了一些可以工作的东西,但是它有一个关键的弱点:如果鼠标指针在线程进入睡眠状态时发生变化,那么我“错过”了这个变化,从而错过了退出条件。我会将等待时间减少到5或10毫秒,但这仍然不是一个好的解决方案

下面是我的代码,让你了解发生了什么:

TimeSpan timePassed = new TimeSpan();
bool lastMousePointerState = ConvertMousePointerStateToBoolean(Mouse.CursorName);
bool currentMousePointerState = true;
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();

while(pointerChanges <= 1 && timePassed.Seconds < synchDurationTimeout)
{
    Thread.Sleep(100);
    currentMousePointerState = ConvertMousePointerStateToBoolean(Mouse.CursorName);
    var variableComparison = lastMousePointerState ^ currentMousePointerState;
    if (variableComparison.Equals(true))
    {
        pointerChanges++;
    }
    timePassed = stopWatch.Elapsed;
    lastMousePointerState = currentMousePointerState;
}
TimeSpan timePassed=new TimeSpan();
bool lastmousepointerate=convertmousepointeratetoboolean(Mouse.CursorName);
bool currentMousePointerState=真;
秒表秒表=新秒表();
秒表。开始();

虽然(指针变化尽管这里有大量的回应,我想回答我自己的问题:-) 我最终实现的(以及对我来说足够好的)是使用原子对象提供的。
我只是从C++代码中生成DLL,并使用循环来检查状态。它仍然不如回调/通知机制好,但我需要完成它,这是迄今为止最好的解决方案。

多么糟糕的解决方法!你们知道什么样的光标只会在窗口正忙时变为沙漏吗(若用户将鼠标移开怎么办?),并且可以通过鼠标移动其他任务(有些任务可能会为了好玩而变为沙漏等)将光标(在窗口中)设为忙吗?也许你会重新考虑是否继续这样做?@Sinatr你是对的:这很可怕,但至少(这是这个场景中唯一的优势)我完全可以控制环境(这是一个自动化的UI测试),所以我知道没有人为用户参与,而且我知道被测试的应用程序始终处于全屏模式。至少我们可以做出这些假设。嗨,希罗,主角,你有其他的解决办法吗?。我也在尝试寻找UI测试的进程同步,但运气好!!!!根据您的UI自动化工具(Ranorex、QTP等),您可以访问Windows系统。如果您这样做,那么答案中提到的代码将对您有所帮助。一般来说,在进入本机C++模式之前,你应该先使用工具的内置功能;