2301_76539266 2023-03-04 22:02 采纳率: 100%
浏览 74
已结题

实现在目标窗口获得鼠标移动的像素点。

实现在目标窗口获得鼠标移动的像素点。效果如下图!
求指点,设了钩子但是不知道,就是不知道要用哪个API

img

  • 写回答

6条回答 默认 最新

  • 极客智能体-在线 2023-03-05 03:44
    关注

    以下答案由GPT-3.5大模型与博主波罗歌共同编写:
    要实现在目标窗口获得鼠标移动的像素点,需要用到Windows操作系统提供的Hook机制。Hook机制可以让我们截取并处理操作系统发出的事件,包括鼠标事件、键盘事件等。在本次场景中,我们需要使用的是鼠标Hook。

    以下是实现步骤:

    1. 使用Windows API函数SetWindowsHookEx注册一个鼠标钩子,参数中指定钩子类型为WH_MOUSE,并指定回调函数。
    2. 当系统发出鼠标事件时,回调函数将被自动调用。在回调函数中,获取鼠标移动的坐标,并使用Windows API函数SendMessage发送自定义消息到目标窗口。
    3. 在目标窗口中,重载处理自定义消息的函数,并在其中处理鼠标移动坐标,并绘制相应的像素点。

    下面是示例代码:

    #include <windows.h>
    
    // 全局变量,用于保存目标窗口句柄
    HWND g_hTargetWnd = NULL;
    
    // 自定义消息,用于通知目标窗口获取鼠标移动坐标
    #define WM_MOUSEMOVE_MSG (WM_USER + 100)
    
    // 鼠标Hook回调函数
    LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
        // 检查Hook是否可用
        if (nCode < 0)
        {
            return CallNextHookEx(NULL, nCode, wParam, lParam);
        }
    
        switch (wParam)
        {
        case WM_MOUSEMOVE:
        {
            // 获取鼠标移动的坐标
            int x = ((MSLLHOOKSTRUCT*)lParam)->pt.x;
            int y = ((MSLLHOOKSTRUCT*)lParam)->pt.y;
    
            // 发送自定义消息到目标窗口
            SendMessage(g_hTargetWnd, WM_MOUSEMOVE_MSG, NULL, MAKELPARAM(x, y));
            break;
        }
        }
    
        return CallNextHookEx(NULL, nCode, wParam, lParam);
    }
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {
        // 获取目标窗口句柄
        g_hTargetWnd = FindWindow(NULL, "窗口标题");
    
        // 注册鼠标Hook
        HHOOK hMouseHook = SetWindowsHookEx(WH_MOUSE, MouseHookProc, hInstance, 0);
    
        // 进入消息循环
        MSG msg;
        while (GetMessage(&msg, NULL, 0, 0))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    
        // 卸载Hook
        UnhookWindowsHookEx(hMouseHook);
    
        return 0;
    }
    
    // 目标窗口消息处理函数
    LRESULT CALLBACK TargetWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        switch (message)
        {
        case WM_MOUSEMOVE_MSG:
        {
            // 获取鼠标移动坐标
            int x = LOWORD(lParam);
            int y = HIWORD(lParam);
    
            // TODO: 在目标窗口中处理鼠标移动坐标,并绘制相应的像素点
    
            break;
        }
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        return 0;
    }
    

    注意事项:

    1. 鼠标Hook需要在主线程中注册,因此示例代码中使用WinMain作为入口函数。
    2. 注册Hook时,需要传递当前程序实例句柄、钩子类型以及回调函数地址。
    3. 钩子回调函数需要检查Hook是否可用,避免无限递归调用。
    4. 目标窗口必须存在,并且使用正确的窗口标题进行查找。
    5. 自定义消息使用了WM_USER + 100,可以根据需要自定义,但必须保证不与系统自带的消息冲突。
    6. 目标窗口需要处理自定义消息,并在其中处理鼠标移动坐标。具体处理方式可以根据实际需求进行设计。

    希望这份代码对你有所帮助!
    如果我的回答解决了您的问题,请采纳!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

问题事件

  • 系统已结题 3月19日
  • 已采纳回答 3月11日
  • 赞助了问题酬金15元 3月4日
  • 创建了问题 3月4日

悬赏问题

  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度