我不明白如何使用 SendMessage 或 PostMessage 调用

2023-11-23

我需要在第三方应用程序中模拟按键。假设我有一个 C# 应用程序,需要将“8”发送到计算器应用程序。我无法使用.Net 的 SendKeys 或 win32 api 的 keybd_event,因为它们都要求窗口成为顶部活动窗口,但在我的情况下不是这种情况。

这样我就只剩下调用 sendMessage 和 postMessage 了。在过去的三个小时里我一直在努力想要得到一些结果,但现在我完全绝望了。

我有以下内容:

        [DllImport("user32.dll")]
    public static extern int FindWindow(string lpClassName,string lpWindowName);
    [DllImport("user32.dll")]
    public static extern int SendMessage(int hWnd, uint Msg, int wParam, int lParam);

    [return: MarshalAs(UnmanagedType.Bool)]
    [DllImport("user32.dll", SetLastError = true)]
    public static extern bool PostMessage(int hWnd, uint Msg, int wParam, int lParam);

    private void button1_Click(object sender, EventArgs e)
    {
        const int WM_KEYDOWN = 0x100;
        const int WM_SYSCOMMAND = 0x018;
        const int SC_CLOSE = 0x053;

        int WindowToFind = FindWindow(null,"Calculator");

        int result = SendMessage(WindowToFind, WM_SYSCOMMAND, SC_CLOSE, 0);
        Boolean result2 = PostMessage(WindowToFind, WM_SYSCOMMAND, SC_CLOSE, 0);

        int result3 = SendMessage(WindowToFind, WM_KEYDOWN,((int)Keys.NumPad7), 0);
        Boolean result4 = PostMessage(WindowToFind, WM_KEYDOWN, ((int)Keys.NumPad7), 0);
    }

正如您所看到的,我尝试了四次与计算器进行通信。使用 sendMessage 和 PostMessage 来关闭窗口并发送密钥 7. 没有任何效果。 FindWindow 方法之所以有效,是因为我获得了应用程序的处理程序(我什至尝试自己启动该进程并使用 process.MainWindowHandler 访问它,但没有运气)。没有错误或异常,但它只是在计算器中不执行任何操作。

我也用记事本尝试过完全相同的操作,但也没有任何改变。


你有可能在 64 位机器上运行这个吗?如果是这样,我相信所有那些实际上是 hWnd 的“int”值(Send/Post 的第一个参数,FindWindow 的返回值)都需要是 IntPtr。


经过更多检查后,看起来对于 SendMessage 和 PostMessage,第 1 个、第 3 个和第 4 个参数应该是 IntPtr 而不是 int (以及所有这些的返回值)

因此,正确的签名是:

[DllImport("user32.dll")]
public static extern IntPtr FindWindow(string lpClassName,string lpWindowName);
[DllImport("user32.dll")]
public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll")]
public static extern IntPtr PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我不明白如何使用 SendMessage 或 PostMessage 调用 的相关文章

  • 如何将 std::string& 转换为 C# 引用字符串

    我正在尝试将 C 函数转换为std string参考C 我的 API 如下所示 void GetStringDemo std string str 理想情况下 我希望在 C 中看到类似的东西 void GetStringDemoWrap r
  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • 随着时间的推移,添加到 List 变得非常慢

    我正在解析一个大约有 1000 行的 html 表 我从一个字符串中添加 10 个字符串 td 每行到一个list td
  • 为什么 GCC 不允许我创建“内联静态 std::stringstream”?

    我将直接前往 MCVE include
  • 从经典 ASP 调用 .Net C# DLL 方法

    我正在开发一个经典的 asp 项目 该项目需要将字符串发送到 DLL DLL 会将其序列化并发送到 Zebra 热敏打印机 我已经构建了我的 DLL 并使用它注册了regasm其次是 代码库这使得 IIS 能够识别它 虽然我可以设置我的对象
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile
  • Mono 应用程序在非阻塞套接字发送时冻结

    我在 debian 9 上的 mono 下运行一个服务器应用程序 大约有 1000 2000 个客户端连接 并且应用程序经常冻结 CPU 使用率达到 100 我执行 kill QUIT pid 来获取线程堆栈转储 但它总是卡在这个位置
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐

  • Google Web Toolkit 是否类似于 AWT 和 Swing

    我简单地查了一下GWT我喜欢这样的想法 我可以用 Java 进行开发 并将应用程序编译为 HTML 和 JavaScript GWT 和 AWT 以及 Swing 背后的概念是相同还是不同 它的编程非常相似 模仿 Swing 并且代码是 1
  • 将用户定义对象的数组列表传递给 Intent android

    我试图将 arraylist 的结构传递给意图 如下所示 在我正在使用的调用函数中 ArrayList
  • C++ 中允许“删除这个”吗?

    是否允许delete this 如果删除语句是对该类的该实例执行的最后一条语句 当然我确信由this 指针是newly 创建的 我正在考虑这样的事情 void SomeModule doStuff in the controller thi
  • 学习 asyncio:“协程从未等待”警告错误

    我正在尝试学习在 Python 中使用 asyncio 来优化脚本 我的示例返回一个coroutine was never awaited警告 您能帮助理解并找到解决方法吗 import time import datetime impor
  • Matlab 条形图 - 根据符号和大小用不同颜色填充条形

    我尝试用不同的颜色对条形图中的各个条形进行着色 例如蓝色表示正值 红色表示负值 我在互联网上找不到任何有效的东西 在下面的代码中 我发现每个条形都根据第一个条形的值进行着色 而不是每个条形的单独颜色 c1 zeros 32 3 c2 zer
  • Typescript 和 Electron 导出未定义

    我正在尝试运行我的简单电子应用程序 我使用 Typescript 作为编译为 JavaScript 的开发语言 当我运行该应用程序时 出现以下错误 ReferenceError exports is not defined Learn Mo
  • Valgrind...释放了大小为 8 的块内的 4 个字节

    尝试释放列表后 我在 Valgrind 中收到此错误 print list 将列表转储到系统日志 我非常有信心输出是正确的 瓦尔格林德 7028 1 errors in context 1 of 10 7028 Invalid read o
  • Colorbox 在 IE 中无法正确加载

    我已经找到了解决方案 但它不是最好的 所以我仍在寻找解决方案 请参阅我的答案以了解我所做的事情 UPDATE 当您打开开发人员工具时它消失的原因是 IE 不能很好地处理任何 console log 语句 直到您打开开发人员工具 某处必须有一
  • 在抽象类中公开静态方法被认为是好还是坏实践[关闭]

    Closed 这个问题是基于意见的 目前不接受答案 我最近遇到一些代码 其中public static方法被定义在一个abstract班级 我想知道这是否被认为是好的做法还是反模式 我制作了一个简单的示例程序来说明我的意思 public a
  • Python - 原始字符串文字[重复]

    这个问题在这里已经有答案了 我不明白原始字符串文字是如何工作的 我知道当使用r它忽略所有特价 就像做时一样 n它将其视为 n 而不是新行 但后来我尝试这样做 x r 它说SyntaxError EOL while scanning stri
  • 将 JSON 字符串保存到 MySQL 数据库

    我有一个 JSON 字符串 name jack school colorado state city NJ id null 我需要将其保存在数据库中 我怎么能这样做呢 我的PHP代码 我只建立了与MySQL的连接 但无法保存记录
  • preg_replace() 正则表达式匹配 CSS 文件中的相对 url() 路径

    我正在组合一些 CSS 文件并将它们写入单独目录中的文件中 我正在尝试更换亲戚url 值以使用新文件位置 忽略任何绝对 URL 下面是一些 CSS 示例 TEST background url test jpg background url
  • 有没有一种方法可以使用 GLFW 在按下按键后仅处理一个输入事件?

    目前 当按住所需的键时 输入会注册多次 有没有办法只处理按下按键后的第一个事件 并忽略后续事件 直到松开按键 我正在使用 processInput 函数 条件如下 if glfwGetKey window GLFW KEY LEFT GLF
  • 如何返回排序列表的索引? [复制]

    这个问题在这里已经有答案了 我需要对列表进行排序 然后返回一个列表 其中包含列表中已排序项目的索引 例如 如果我要排序的列表是 2 3 1 4 5 我需要 2 0 1 3 4 被退回 这个问题发布在字节上 但我想我会在这里重新发布 http
  • 从路径获取文件夹名称

    如果我有一个像 C My Documents Images Image1 png 这样的文件路径 如何获取 Image1 png 文件的父文件夹名称 在本例中为 图像 但这只是一个示例 我已经看过了System IO Path那里似乎什么也
  • C++:如果抛出异常,超出范围的对象是否会被销毁?

    通常它会在作用域结束时被破坏 如果抛出异常 我可以看到出现问题 Yes C 标准 n3337 15 异常处理 15 2 构造函数和析构函数 1 当控制从 throw 表达式传递到处理程序时 析构函数 被调用用于自 try 块以来构造的所有自
  • 如何在R的keras包中设置class_weight?

    我在用keras将其封装在 R 中以训练深度学习模型 我的数据集高度不平衡 因此 我想设置class weight论据中的fit功能 这是我用于模型的拟合函数及其参数 history lt model gt fit trainData tr
  • Paperclip-使用 content_type='application/octet-stream' 验证 pdf

    我正在使用paperclip用于文件上传 验证如下 validates attachment content type upload content type gt application pdf if gt Proc new module
  • 为什么 php 在引用不存在的变量时不会抱怨?

    我想知道为什么当我们引用一个不存在的变量 无论是普通变量还是数组 时 php 不会抱怨 这就是它的样子 还是我还缺少其他东西 例如这段代码 不会抛出有关不存在变量的警告 除此之外var dump显示这个 array 1 er gt NULL
  • 我不明白如何使用 SendMessage 或 PostMessage 调用

    我需要在第三方应用程序中模拟按键 假设我有一个 C 应用程序 需要将 8 发送到计算器应用程序 我无法使用 Net 的 SendKeys 或 win32 api 的 keybd event 因为它们都要求窗口成为顶部活动窗口 但在我的情况下