如何在win32应用程序中记录鼠标光标移动的距离? 我正在使用Win32 API在C++上开发一个Windows桌面开发项目。在应用程序中,我试图计算鼠标光标移动的距离,或者说鼠标抖动。

如何在win32应用程序中记录鼠标光标移动的距离? 我正在使用Win32 API在C++上开发一个Windows桌面开发项目。在应用程序中,我试图计算鼠标光标移动的距离,或者说鼠标抖动。,c++,json,winapi,logging,mouse-cursor,C++,Json,Winapi,Logging,Mouse Cursor,对于一个如此沮丧的用户来说,挥动光标、挥动光标或鼠标并不是什么双关语,因为他们在大声咒骂的同时失去了对手臂的控制。相反,鞭打光标是指用户不规则地前后移动光标 在页面上快速移动光标可能表示用户对他们体验的某些方面感到恼火。也许网站的性能很慢,或者他们正努力想办法解决问题。被击打的光标就像是用户身体上某种精神状态的流露,这种状态很可能是沮丧。和所有挫折信号一样,光标抖动也有可能出现误报。例如,可能用户的鼠标坏了,或者他们的电脑速度太慢,以至于他们用鼠标来表示抗议。判断被敲击的光标是否表示沮丧的唯一方

对于一个如此沮丧的用户来说,挥动光标、挥动光标或鼠标并不是什么双关语,因为他们在大声咒骂的同时失去了对手臂的控制。相反,鞭打光标是指用户不规则地前后移动光标

在页面上快速移动光标可能表示用户对他们体验的某些方面感到恼火。也许网站的性能很慢,或者他们正努力想办法解决问题。被击打的光标就像是用户身体上某种精神状态的流露,这种状态很可能是沮丧。和所有挫折信号一样,光标抖动也有可能出现误报。例如,可能用户的鼠标坏了,或者他们的电脑速度太慢,以至于他们用鼠标来表示抗议。判断被敲击的光标是否表示沮丧的唯一方法是观察会话并进行观察

通过鼠标摆动,我的意思是我想记录鼠标光标在搜索任何按钮或工具时的不稳定移动,所以我想记录在这种不稳定移动中移动的总距离

我想记录这个会话的信息,并以json格式发送到我的服务器

在这个颠簸过程中,用户可能会单击鼠标,这可能会生成
WM_LBUTTONDOWN
,但我正在使用该消息执行某些功能,我不希望在用户无法调用该特定功能时单击鼠标


如果有人能帮助我,我是win32桌面开发新手。

我仍然不清楚问题出在哪里,但我在底部列出了一些猜测

下面是一个基本想法的示例:

case WM_MOUSEMOVE:
    POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
    LogMouseMovementForTracking(pt);
    WhateverOtherStuffYouWantToDoWhenTheMouseMoves(pt);
    break;

case WM_LBUTTONDOWN:
    // You don't have to do tracking here.  You will almost certainly have
    // received a WM_MOUSEMOVE that brings you to the click before the
    // system sends you the WM_LBUTTONDOWN.
    WhateverYouWantToDoWhenTheButtonIsPressed();
    break;
关于你的问题,我的一些猜测:

  • 当鼠标移动到子窗口上(或被子窗口捕获)时,您的窗口可能不会收到
    WM_MOUSEMOVE
    消息,但您希望记录这些消息
  • 您的窗口正在捕获鼠标(可能是当您获得
    WM_LBUTTONDOWN
    时),这使得
    WM_MOUSEMOVE
    逻辑更加复杂
  • 您试图区分颠簸和非颠簸,只记录颠簸,但我们(可能还有您)对颠簸的定义并不精确
  • 您希望应用程序能够看到Windows会话中的所有鼠标移动,而不仅仅是应用程序窗口中的鼠标移动
  • 您的switch语句中的一个案例意外地落入另一个案例

如果您能进一步澄清这个问题,我们可能会帮助您。

是的,这正是我想做的,但我不知道如何实现这一点。我想在鼠标移动时记录所有坐标并计算总距离。

我能帮你做到这一点

可以安装鼠标挂钩来监视鼠标移动并计算鼠标坐标之间的距离

代码:

#包括
#包括
#包括
使用名称空间std;
HHOOK鼠标套;
std::向量pt;
点p1={0};
布尔标志=1;
int x=0,y=0;
int-dis=0;
LRESULT uu stdcall MouseHookCallback(int-nCode、WPARAM-WPARAM、LPARAM-LPARAM)
{  
如果(nCode>=0)
{
交换机(wParam)
{
案例WM_MOUSEMOVE:
MSLLHOOKSTRUCT*mslsstruct=(MSLLHOOKSTRUCT*)LPRAM;
pt.推回(MSLStruct->pt);
国际单项体育联合会(旗)
{
p1=pt.back();
flag=0;
}
x=abs(pt.back().x-p1.x);
y=abs(pt.back().y-p1.y);
dis+=sqrt(x*x+y*y);
p1=pt.back();

cout这是我发现的一种方法,它不需要显式地编写
.dll
和函数来获取进程的线程。 而且不用鼠标挂钩

  std::vector<POINT> pt;
    POINT p1 = { 0 };
    BOOL flag = 1;
    int x = 0, y = 0;
    int dis = 0;  



case WM_MOUSEMOVE:
            GetCursorPos(&point);
            pt.push_back(point);
            if (flag)
            {
                p1 = pt.back();
                flag = 0;   
            }
            x = abs(pt.back().x - p1.x);
            y = abs(pt.back().y - p1.y);
            dis += sqrt(x * x + y * y);
            p1 = pt.back();
            wchar_t waCoord1[20];
            wsprintf(waCoord1, _T("(%i)"), dis);
            OutputDebugString(waCoord1);
std::vector pt;
点p1={0};
布尔标志=1;
int x=0,y=0;
int-dis=0;
案例WM_MOUSEMOVE:
GetCursorPos(&point);
pt.推回(点);
国际单项体育联合会(旗)
{
p1=pt.back();
flag=0;
}
x=abs(pt.back().x-p1.x);
y=abs(pt.back().y-p1.y);
dis+=sqrt(x*x+y*y);
p1=pt.back();
wchar_t waCoord1[20];
wsprintf(waCoord1,_T((%i)”),dis;
OutputDebugString(waCoord1);

评论不用于扩展讨论;此对话已被删除。我们可以在用户级别执行此操作吗?@Nurav您的意思是在特定用户上使用鼠标挂钩吗?不,实际上它记录了完整的监视器屏幕,我想记录应用程序区域。@Nurav是的,将包含鼠标挂钩的dll插入目标程序。请参阅我的更新内容。@Nurav很高兴看到我的更新内容。@Nurav帮助你:)如果它是自己的win32窗口,这是一个可行的解决方案。但是如果它是另一个窗口,你如何获得
WM\u MOUSEMOVE
// dllmain.cpp : Defines the entry point for the DLL application.
#include "pch.h"
#include <windows.h>
#include <iostream>
#include <stdio.h>
#include <vector>

HINSTANCE hinst;
#pragma data_seg(".shared")
HHOOK hhk;
#pragma data_seg()

std::vector<POINT> pt;
POINT p1 = { 0 };
BOOL flag = 1;
int x = 0, y = 0;
int dis = 0;

LRESULT CALLBACK wiremouseProc(int code, WPARAM wParam, LPARAM lParam) {
    if (code >= 0)
    {
        switch (wParam)
        {
        case WM_MOUSEMOVE:
            MSLLHOOKSTRUCT* MSLStruct = (MSLLHOOKSTRUCT*)lParam;
            pt.push_back(MSLStruct->pt);

            if (flag)
            {
                p1 = pt.back();
                flag = 0;
            }
            x = abs(pt.back().x - p1.x);
            y = abs(pt.back().y - p1.y);
            dis += sqrt(x * x + y * y);
            p1 = pt.back();

            std::cout << dis << std::endl;

            return 0;
        }
    }
    return CallNextHookEx(hhk, code, wParam, lParam);
}

extern "C" __declspec(dllexport) void install(unsigned long threadID) {
    hhk = SetWindowsHookEx(WH_MOUSE, wiremouseProc, hinst, threadID);
}
extern "C" __declspec(dllexport) void uninstall() {
    UnhookWindowsHookEx(hhk);
}

BOOL WINAPI DllMain(__in HINSTANCE hinstDLL, __in  DWORD fdwReason, __in  LPVOID lpvReserved) {
    hinst = hinstDLL;
    return TRUE;
}
#include <Windows.h>
#include <stdio.h>
#include <tchar.h>

unsigned long GetTargetThreadIdFromWindow(const char* className, const char* windowName)
{
    HWND targetWnd;
    HANDLE hProcess;
    unsigned long processID = 0;

    targetWnd = FindWindow(className, windowName);
    return GetWindowThreadProcessId(targetWnd, &processID);
}

int main() {
    unsigned long threadID = GetTargetThreadIdFromWindow("Notepad", "1.txt - Notepad"); // Use Notepad for test
    printf("TID: %i", threadID);

    HINSTANCE hinst = LoadLibrary(_T("D:\\Test_WH_MOUSE\\Mydll\\Debug\\Mydll.dll"));

    if (hinst) {
        typedef void (*Install)(unsigned long);
        typedef void (*Uninstall)();

        Install install = (Install)GetProcAddress(hinst, "install");
        Uninstall uninstall = (Uninstall)GetProcAddress(hinst, "uninstall");

        install(threadID);

        MSG msg = {};

        while (GetMessage(&msg, NULL, 0, 0)) {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }

        uninstall();
    }

    return 0;
}
  std::vector<POINT> pt;
    POINT p1 = { 0 };
    BOOL flag = 1;
    int x = 0, y = 0;
    int dis = 0;  



case WM_MOUSEMOVE:
            GetCursorPos(&point);
            pt.push_back(point);
            if (flag)
            {
                p1 = pt.back();
                flag = 0;   
            }
            x = abs(pt.back().x - p1.x);
            y = abs(pt.back().y - p1.y);
            dis += sqrt(x * x + y * y);
            p1 = pt.back();
            wchar_t waCoord1[20];
            wsprintf(waCoord1, _T("(%i)"), dis);
            OutputDebugString(waCoord1);