关于#c++#的问题:求获得指定窗口的鼠标指针移动的像素点

求获得指定窗口的鼠标指针移动的像素点
想要获得一个窗口的鼠标指针移动的像素点

您可以使用Windows API函数来获取指定窗口的鼠标指针移动的像素点。以下是使用C++的示例代码:

首先,您需要获取指定窗口的句柄:

HWND hWnd = FindWindow(NULL, "窗口标题");

接下来,您需要注册一个Raw Input设备:

RAWINPUTDEVICE Rid[1];
Rid[0].usUsagePage = 0x01; // Generic desktop controls
Rid[0].usUsage = 0x02; // Mouse
Rid[0].dwFlags = RIDEV_INPUTSINK;
Rid[0].hwndTarget = hWnd;
if (RegisterRawInputDevices(Rid, 1, sizeof(Rid[0])) == FALSE) {
// 注册失败处理
}

最后,您需要处理WM_INPUT消息并获取鼠标移动的像素点:



case WM_INPUT:
{
UINT dwSize = 0;
GetRawInputData((HRAWINPUT)lParam, RID_INPUT, NULL, &dwSize, sizeof(RAWINPUTHEADER));
LPBYTE lpb = new BYTE[dwSize];
if (lpb == NULL) {
return 0;
}
if (GetRawInputData((HRAWINPUT)lParam, RID_INPUT, lpb, &dwSize, sizeof(RAWINPUTHEADER)) != dwSize) {
// 错误处理
}
RAWINPUT* raw = (RAWINPUT*)lpb;
if (raw->header.dwType == RIM_TYPEMOUSE) {
// 获取鼠标移动的像素点
int x = raw->data.mouse.lLastX;
int y = raw->data.mouse.lLastY;
// 处理鼠标移动的像素点
}
delete[] lpb;
break;
}

如果要获取非当前窗口的鼠标指针移动的像素点,您需要使用SetWindowsHookEx函数来安装一个鼠标钩子。

该回答引用GPTᴼᴾᴱᴺᴬᴵ
你可以使用Windows API函数来获取鼠标的移动信息。具体来说,你需要使用以下函数:

  1. GetCursorPos:该函数用于获取当前鼠标指针的屏幕坐标。
  2. ScreenToClient:该函数用于将屏幕坐标转换为指定窗口的客户区坐标。

使用这些函数,你可以编写一个程序来捕获指定窗口的鼠标移动信息。以下是一个示例程序,演示了如何获取指定窗口的鼠标移动信息:

#include <Windows.h>

int main()
{
    // 获取指定窗口的句柄
    HWND hwnd = FindWindow(NULL, "窗口标题");

    // 获取指定窗口的客户区矩形
    RECT rect;
    GetClientRect(hwnd, &rect);

    // 进入消息循环
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        // 处理消息
        if (msg.message == WM_MOUSEMOVE)
        {
            // 获取鼠标指针的屏幕坐标
            POINT ptScreen;
            GetCursorPos(&ptScreen);

            // 将屏幕坐标转换为客户区坐标
            POINT ptClient = ptScreen;
            ScreenToClient(hwnd, &ptClient);

            // 检查鼠标是否在窗口的客户区内
            if (PtInRect(&rect, ptClient))
            {
                // 输出鼠标指针在客户区内的坐标
                printf("x=%d, y=%d\n", ptClient.x, ptClient.y);
            }
        }

        // 发送消息给窗口的消息队列
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return 0;
}


这个程序可以在指定窗口内捕获鼠标指针的移动信息,并将其转换为窗口客户区内的坐标,然后输出这些坐标。你可以根据自己的需要,修改程序来实现其他的功能。


#include <windows.h>

// 窗口回调函数
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
        case WM_MOUSEMOVE:
            {
                // 获取鼠标指针的位置
                POINT cursorPos;
                GetCursorPos(&cursorPos);

                // 将鼠标指针的位置转换为窗口坐标系中的位置
                ScreenToClient(hwnd, &cursorPos);

                // 在控制台中输出鼠标指针移动的像素点
                printf("Mouse moved %d pixels to the right and %d pixels down.\n",
                       cursorPos.x, cursorPos.y);
            }
            break;

        default:
            return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }

    return 0;
}

int main()
{
    // 注册窗口类
    WNDCLASS wc = {};
    wc.lpfnWndProc = WindowProc;
    wc.hInstance = GetModuleHandle(NULL);
    wc.lpszClassName = "MyWindowClass";
    RegisterClass(&wc);

    // 创建窗口
    HWND hwnd = CreateWindowEx(0, "MyWindowClass", "My Window",
                               WS_OVERLAPPEDWINDOW | WS_VISIBLE,
                               CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
                               NULL, NULL, GetModuleHandle(NULL), NULL);

    // 处理窗口消息
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return 0;
}

小魔女参考了bing和GPT部分内容调写:
在C++中,要获得指定窗口的鼠标指针移动的像素点,可以使用Windows API函数GetCursorPos()来实现。该函数可以获取当前鼠标指针的屏幕坐标,可以获取鼠标指针的移动距离。

具体实现步骤如下:

  1. 首先,需要在程序中包含Windows头文件:

    #include <windows.h>
    
  2. 然后,定义一个POINT结构体,用来存储鼠标指针的坐标:

    POINT pt;
    
  3. 接着,使用GetCursorPos()函数获取鼠标指针的坐标:

    GetCursorPos(&pt);
    
  4. 最后,计算鼠标指针移动的像素点:

    int x = pt.x - pre_x;
    int y = pt.y - pre_y;
    

上述步骤完成后,就可以获取指定窗口的鼠标指针移动的像素点了。
回答不易,记得采纳呀。

参考:

#include <Windows.h>

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

int main()
{
    // 创建窗口
    WNDCLASS wc = {0};
    wc.lpfnWndProc = WindowProc;
    wc.hInstance = GetModuleHandle(nullptr);
    wc.lpszClassName = "MyWindowClass";
    RegisterClass(&wc);

    HWND hwnd = CreateWindow("MyWindowClass", "My Window", WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
        nullptr, nullptr, GetModuleHandle(nullptr), nullptr);

    ShowWindow(hwnd, SW_SHOW);

    // 进入消息循环
    MSG msg = {0};
    while (GetMessage(&msg, nullptr, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return 0;
}

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
        case WM_MOUSEMOVE:
        {
            // 获取鼠标坐标
            int xPos = GET_X_LPARAM(lParam);
            int yPos = GET_Y_LPARAM(lParam);

            // 输出鼠标坐标
            printf("Mouse position: (%d, %d)\n", xPos, yPos);

            break;
        }

        case WM_DESTROY:
        {
            PostQuitMessage(0);
            break;
        }

        default:
            return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }

    return 0;
}


参考GPT和自己的思路,你可以使用Windows API中的GetCursorPos函数来获取鼠标指针的位置。具体实现步骤如下:

1 调用FindWindow函数查找目标窗口的句柄。
2 调用GetCursorPos函数获取鼠标指针的当前位置。
3 调用ScreenToClient函数将鼠标指针的位置转换为目标窗口客户区域的坐标系中的位置。
以下是一个示例代码,演示如何实现这个功能:

#include <Windows.h>

int main()
{
    HWND targetWnd = FindWindow(NULL, L"Target Window Title"); // 替换为目标窗口的标题

    if (targetWnd != NULL)
    {
        POINT cursorPos;
        GetCursorPos(&cursorPos);

        ScreenToClient(targetWnd, &cursorPos);

        int x = cursorPos.x;
        int y = cursorPos.y;

        // 这里是你想要对坐标进行的操作
    }
    
    return 0;
}

注意,这段代码需要在目标窗口的进程中运行才能获取正确的坐标值。如果你想在不同的进程中获取目标窗口的坐标值,你需要使用更复杂的技术,比如Windows Hooks。