如何在 Windows 中通过鼠标挂钩设置光标位置?

2023-12-31

我正在尝试创建一个小应用程序,它将检测鼠标光标何时移动到屏幕边缘并将其移动到相对的边缘,以创建连续的桌面效果(如果有意义的话)。

下面是其他人的一些代码(鼠标钩子部分),我通过添加 SetCursorPos 来将鼠标暂时移动到固定位置。当我运行它时,SetCursorPos 返回 true,我认为这意味着调用成功,但鼠标没有移动。我在某处读到过一些关于后来的 Windows 版本中的安全限制阻止此类内容的内容,这是有道理的,但来源不清楚这有多真实。有谁知道为什么这行不通?

谢谢,代码如下:

#define _WIN32_WINNT 0x0400
#pragma comment( lib, "user32.lib" )

#include <windows.h>
#include <stdio.h>

HHOOK hMouseHook;

__declspec(dllexport) LRESULT CALLBACK KeyboardEvent (int nCode, WPARAM wParam, LPARAM lParam)
{
    MOUSEHOOKSTRUCT * pMouseStruct = (MOUSEHOOKSTRUCT *)lParam;
    if (pMouseStruct != NULL)
    {
        if (pMouseStruct->pt.x < -1900)
        {
            BOOL r = SetCursorPos(
                500,
                500
            );

            printf("Trigger %d.  Response %d", pMouseStruct->pt.x, r);
        }
    }

    return CallNextHookEx(hMouseHook, nCode, wParam, lParam);
}

void MessageLoop()
{
    MSG message;
    while (GetMessage(&message,NULL,0,0)) {
        TranslateMessage( &message );
        DispatchMessage( &message );
    }
}

DWORD WINAPI MyMouseLogger(LPVOID lpParm)
{
    HINSTANCE hInstance = GetModuleHandle(NULL);
    if (!hInstance) hInstance = LoadLibrary((LPCSTR) lpParm); 
    if (!hInstance) return 1;

    hMouseHook = SetWindowsHookEx (  
        WH_MOUSE_LL,
        (HOOKPROC) KeyboardEvent,  
        hInstance,                 
        NULL                       
        );
    MessageLoop();
    UnhookWindowsHookEx(hMouseHook);
    return 0;
}

int main(int argc, char** argv)
{
    HANDLE hThread;
    DWORD dwThread;

    hThread = CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)
        MyMouseLogger, (LPVOID) argv[0], NULL, &dwThread);
    if (hThread)
        return WaitForSingleObject(hThread,INFINITE);
    else return 1;
}

这似乎是在挂钩过程中调用 SetCursorPos 时出现的问题。我猜想这在 Vista/Windows 7 中是明确禁止的,但我找不到任何文档来证实这一点。我稍微修改了您的代码,以便在想要移动光标时发布一条线程消息,并在消息过程中执行实际的 SetCursorPos 操作。一旦完成,它就可以正常工作。

在你的钩子程序中:

if (pMouseStruct->pt.x < -1900)
    {
        PostThreadMessage( GetCurrentThreadId(), WM_USER, 0, 0 );
        printf("Trigger %d.  Response %d", pMouseStruct->pt.x, r);
    }

在你的消息循环中:

while (GetMessage(&message,NULL,0,0)) {
    if( message.hwnd == NULL ) {
        if( message.message == WM_USER ) {
            SetWindowPos( 500, 500 );
        }
     } else {
         TranslateMessage( &message );
         DispatchMessage( &message );
     }
}

(请注意,这只是一个演示,而不是实际的修复。)

话虽这么说,您的代码存在许多严重的问题。我认为在这里讨论所有这些内容并不合适,但我建议您将其发布在https://codereview.stackexchange.com/ https://codereview.stackexchange.com/.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Windows 中通过鼠标挂钩设置光标位置? 的相关文章

  • 在列表中查找匹配项的最简洁方法

    在列表中查找内容的最佳方式是什么 我知道 LINQ 有一些不错的技巧 但我们也可以获取有关 C 2 0 的建议 让我们对这个常见的代码模式进行最佳重构 目前我使用这样的代码 mObjList is a List
  • 在 C++ 中,当我将值传递给函数时,它是否总是转换为适当的类型?

    如果我有一个像这样的函数void func size t x 我称该函数为func 5 5 立即转换为size t类型 这通常适用于所有类型吗 我问这个问题是因为我发誓我见过人们编写代码 他们做类似的事情func 5 0 将 5 作为双精度
  • C/C++ 程序是在 CPU 上运行还是在内核上运行?

    我已经编程很多年了 但有一件事我一直不明白 有两种类型的编程语言 编译型语言和解释型语言 编译型语言首先需要编译成解释型语言 然后才能执行 例如 C C 需要先编译为机器语言 然后才能执行 我的问题来了 谁真正运行已编译的 C C Wind
  • 是否可以通过引用以基类作为参数的函数来传递派生类

    假设我们有一个抽象基类IBase使用纯虚方法 接口 然后我们推导出CFoo CFoo2来自基类 我们有一个知道如何使用 IBase 的函数 Foo IBase input 这些情况下通常的场景是这样的 IBase ptr static ca
  • 我可以将特定警告视为错误吗?

    以下是我有时在学生代码中看到的模式的简化版本 bool foobar int a int b if a lt b return true 当然 真正的代码要复杂得多 Visual Studio 报告警告 C4715 并非所有控制路径都会返回
  • 是否可以获取指向装箱非托管值类型的指针?

    是否可以获取指向装箱非托管值类型的指针 而无需编写对每个支持的类型进行强制转换的大型 switch 语句 就像是 object val Contains a boxed unmanaged value such as int long by
  • memccpy 返回比 src 起始地址更低的内存地址

    我有一个学校项目 我必须重新编码memccpy 功能 我使用 2 个程序来检查我的代码是否正常工作 第一个是只有一个主程序的小程序 第二个程序是另一个学生开发的 可以找到here https github com yyang42 mouli
  • 在 C++ 中初始化指针

    可以在声明时将指针分配给值吗 像这样的东西 int p 1000 是的 您可以在声明时初始化指向值的指针 但是您不能这样做 int p 1000 是个地址运算符 并且您不能将其应用于常量 尽管如果可以 那会很有趣 尝试使用另一个变量 int
  • 二维数组的列求和

    我有一个IEnumerable
  • C++ 虚拟关键字与重写函数

    我正在学习c 并且正在学习virtual关键字 我在互联网上搜索试图理解它但无济于事 我进入编辑器并做了以下实验 期望它打印两次基本消息 因为我的印象是需要 virtual 关键字来覆盖函数 然而 它打印出了两条不同的消息 有人可以向我解释
  • 在 OpenGL 中使用不同的着色器程序?

    我必须在 OpenGL 中针对不同的对象使用两个不同的着色器程序 我发现我必须使用glUseProgram 在不同的着色器程序之间切换 但对此没有太多信息 鉴于我有两个用于不同对象的不同着色器程序 如何为每个着色器程序生成和绑定 VAO 和
  • 不可能的事情发生了!这是什么意思?

    我遇到了一个有趣的运行时错误 我认为这是某种内存泄漏 我写了以下程序 C Code include
  • 如何在Phone类库项目中添加ResourceDictionary并访问它

    我正在开发一个项目 其中我有一个引用图书馆项目的子项目 在我的库项目 电话类库 中 如何创建 ResourceDictionary xaml 其中我需要添加一些样式并在 xaml 文件和 cs 文件中使用它 我需要访问 xaml 文件中的
  • 当 C 中没有足够的内存用于静态分配时会发生什么?

    当您动态分配内存时 例如malloc 1024 sizeof char 结果指针设置为NULL如果没有足够的可用内存来满足请求 当没有足够的内存来满足静态分配时会发生什么 例如char c 1024 char c 1024 不一定是静态分配
  • 如何明智地解释这个编译器警告?

    当我执行这段代码时question https stackoverflow com a 51056490 2411320 我收到这个警告 warning format d expects argument of type int but a
  • 使用 Node.js 访问用 C++ 编写的 SDK

    我有一个用 C 语言编写的 SDK 可以与我的扫描仪设备进行通信 我需要开发一个可以访问扫描仪设备的电子应用程序 我知道有很多库可用于扫描仪 但我想使用这个 SDK 因为它允许我访问设备的完整功能 而且它是由设备制造商提供的 那么 有没有什
  • std::iota 的 iota 代表什么?

    我假设 i 是增量 a 是分配 但我无法弄清楚或找到答案 而且 它看起来与非标准非常相似itoa我认为这很令人困惑 C iota is not an acronym or an initialism It is the word iota
  • 您的 C++ 程序中是否仍然存在内存分配失败问题 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在为公司写一些指导方针 我需要回答一些棘手的问题 这一项是相当困难的 解决方案可以是 根本不跟踪 确保使用 new 分配对象 这会在分配失败
  • 在标准 C 中将 int 转换为 string

    我是 C 新手 我正在寻找一个可以调用函数进行转换的示例int串起来 我发现itoa但这不是标准 C 的一部分 我还发现sprintf str d aInt 但问题是我不知道所需的 str 的大小 因此 我如何传递输出字符串的正确大小 有多
  • WPF DataGrid 选定项

    我有一个 DataGrid 用户可以通过在最后一行输入数据来添加项目 我还有一个按钮可以删除当前选定的项目 但是 当选择最后一行 空 用于添加新项目 时 最后选定的项目将保留在 SelectedItem 中 因此 如果我打开窗口 选择最后一

随机推荐

  • 手动实现bayern转RGB

    我正在尝试实现图像转换 Bayern Pattern gt RGB I uploaded this image 这是我的代码片段 import cv2 import numpy as np from matplotlib import py
  • 使用 Python Logging 记录出现两次的消息

    我正在使用 Python 日志记录 由于某种原因 我的所有消息都出现了两次 我有一个配置日志记录的模块 BUG It s outputting logging messages twice not sure why it s not the
  • pcap_pkthdr 是做什么用的?

    代码片段来自here https www winpcap org docs docs 40 2 html group wpcap tut6 html void packet handler u char param const struct
  • 如何使用 .NET Core 从 nuget 从命令行下载包?

    微软软件包Linux 上的 NET Core https learn microsoft com en us nuget tools cli ref install对于Ubuntu 我目前正在使用它 我现在想安装Json NET https
  • Spring:POJO的@Autowired,不由Spring管理[重复]

    这个问题在这里已经有答案了 我使用 Autowired 在 POJO 中注入一些服务 这些服务注册为 Bean 如果一旦 POJO 由 Spring 管理 它也在 Spring Config 上注册为 Bean 那么注入服务就没有问题 但是
  • 在 Linux 中将文本文件中的空格替换为逗号

    我需要编辑一些文本文件 来自sar 并将它们转换为 CSV 文件 我需要使用 sed 或 awk 函数 Linux 中的简单 shell 脚本 更改每个空格 可能是输出中数字之间的制表符 谁能帮我 我使用的每个命令根本没有改变文件 我试过g
  • 如何使滚动条在有角度的材料中始终可见?

    所以目前 我正在使用角度材料及其默认滚动 但我认为它是完美的滚动条 用作滚动条的滚动设计 但只有当用户尝试滚动页面 div 时才会显示滚动 我尝试阅读 Angular Material 的滚动 api 但没有可以在此处使用的属性 我已经把o
  • Selenium 中的 WebDriver 和 WebElement 有什么区别?

    Selenium 中的 WebDriver 和 WebElement 有什么区别 示例代码 WebDriver driver new FirefoxDriver driver get http www google com WebEleme
  • 反应本机 PIP

    我需要将画中画模式添加到反应本机应用程序 iOS 中 但我不知道如何去做 我看到这是react native video 的一个功能 但我对视频使用了不同的模块 所以我只能将画中画添加为单独的功能 任何包含有关如何设置的详细信息的文档 博客
  • Puppeteer 流程​​逻辑,检查导航是否发生(与等待)

    寻找一些反馈 在 Puppeteer 中 我想检查导航是否发生 如果发生则执行某些操作 否则如果未发生则执行其他操作 例如重试 我想出的两种方法是 if await page url finalURL let t 0 busy while
  • Selenium WebDriver Click() 在 IE9 中失败

    我看过很多其他类似的帖子 不幸的是无法解决这个问题 所以这里 我正在使用 Selenium WebDriver C 实现 版本 2 15 来驱动一个相当简单的网页 该页面包含一个表单 其中有两个用于用户名和密码的 以及一个用于提交表单的 我
  • 使用 tidyverse 和 broom 进行许多回归:相同的因变量,不同的自变量

    此链接显示了在我们具有相同的自变量但可能有许多不同的因变量的情况下如何回答我的问题 使用 broom 和 tidyverse 对不同的因变量进行回归 https stackoverflow com questions 51642146 us
  • Magento 2:重新索引不起作用

    我做不到重新索引 in 玛根托2 谷歌之后我得到了解决方案We can reindex with shell command php dev shell indexer php reindexall 但它给出了错误 Could not op
  • 无法使用 C# 客户端反序列化日期时间属性 Neo4j

    我正在尝试使用 C 客户端从 Neo4j 中获取强类型对象 这一切都有效 直到我添加DateTime财产 我已成功将数据插入 Neo4j 数据库 并且可以使用控制台查看它 我还可以查询数据 但无法返回任何强类型对象 因为反序列化似乎失败 我
  • Linux C++:如何跨多个文件正确使用模板专业化?

    我有一个奇怪的问题 在 Windows 上 使用 Visual Studio 2010 以及 Intel 编译器 一切都按预期链接 但是 当我尝试在 Linux 上使用 CLang 3 0 编译代码时 它会编译 如果我只使用单个 CPP 文
  • 如何测量 Android wifi 连接中的上传/下载速度和延迟

    我需要一些 api 或操作代码 通过它们我可以测量 android 应用程序的上传 下载速度和 wifi 连接的延迟 您使用的是 2 2 Froyo 或更高版本吗 如果是这样 请在您的应用程序中导入流量统计信息 并在您的应用程序使用互联网时
  • C# 数据绑定不更新 WPF

    我正在尝试在后面的 C 代码而不是 XAML 中进行数据绑定 在 Expression Blend 2 中创建的 XAML 绑定到我的 CLR 对象工作正常 我的 C 实现仅在应用程序启动时更新 之后对 CLR 的后续更改不会更新我的标签内
  • php 抓取并输出给定​​标签中的特定值或数字

    所以我对 php 很陌生 但在一些帮助下 我已经弄清楚如何抓取具有像 h1 class 这样的标签标识符的网站 更好的是 我已经弄清楚如何输出我想要的精确单词或值 只要它由空格分隔即可 例如 如果给定的标签名称 的输出为 30 个球 我可以
  • Android:当我在片段附近使用它时,在 runOnUiThread 附近出现错误

    我是 Android 开发新手 我想将按钮与动画链接起来 我在附近遇到错误runOnUiThread and getApplication 当我将其添加为一项活动时 这很好 但是当在MainFragment它给出了错误 但是 当我修复错误时
  • 如何在 Windows 中通过鼠标挂钩设置光标位置?

    我正在尝试创建一个小应用程序 它将检测鼠标光标何时移动到屏幕边缘并将其移动到相对的边缘 以创建连续的桌面效果 如果有意义的话 下面是其他人的一些代码 鼠标钩子部分 我通过添加 SetCursorPos 来将鼠标暂时移动到固定位置 当我运行它