我不明白如何使用 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 调用 的相关文章

  • 如何在 VC++ CString 中验证有效的整数和浮点数

    有人可以告诉我一种有效的方法来验证 CString 对象中存在的数字是有效整数还是浮点数吗 Use tcstol http msdn microsoft com en us library w4z2wdyc aspx and tcstod
  • 在 HKCR 中创建新密钥有效,但不起作用

    我有以下代码 它返回 成功 但使用两种不同的工具使用搜索字符串 3BDAAC43 E734 11D5 93AF 00105A990292 搜索注册表不会产生任何结果 RegistryKey RK Registry ClassesRoot C
  • 使用 CMake 时如何导出 Emscripten 中的 C 函数

    In 本教程 https emscripten org docs porting connecting cpp and javascript Interacting with code html interacting with code
  • 将类对象放置在向量中?

    我注意到我可以将一个类放置在一个向量中 这是我的程序 我收到以下错误 out blackjack exe blackjack obj blackjack obj error LNK2019 unresolved external symbo
  • 当事件button.click发生时,如何获取按钮名称/标签?

    我以编程方式制作按钮并将它们添加到堆栈面板中 以便每次用户导航到页面时按钮都会发生变化 我正在尝试做这样的事情 当我单击创建的按钮时 它将获取按钮的标签并转到正确的页面 但是 我无法使用 RoutedEventHandler 访问按钮元素
  • 语音识别编程问题入门

    所以 你们可能都看过 钢铁侠 其中托尼与一个名为贾维斯的人工智能系统进行交互 演示剪辑here http www youtube com watch v Go8zsh1Ev6Y 抱歉 这是广告 我非常熟悉 C C 和 Visual Basi
  • 在 C# 中,如何根据在 gridview 行中单击的按钮引用特定产品记录

    我有一个显示产品网格视图的页面 该表内有一列 其中有一个名为 详细信息 的超链接 我想这样做 以便如果用户单击该特定产品的详细信息单元格 将打开一个新页面 提供有关该产品的更多信息 我不确定如何确定哪个Product记录链接的详细信息以及我
  • 在 VS 中运行时如何查看 C# 控制台程序的输出?

    我刚刚编写了一个名为 helloworld 的聪明程序 它是一个 C NET 4 5 控制台应用程序 在扭曲的嵌套逻辑迷宫深处 使用了 Console WriteLine 当我在命令行运行它时 它会运行并且我会看到输出 我可以执行其他命令并
  • 如何将AVFrame转换为glTexImage2D使用的纹理?

    如您所知 AVFrame 有 2 个属性 pFrame gt data pFrame gt linesize 当我从视频 sdcard test mp4 android平台 读取帧后 并将其转换为RGB AVFrame副 img conve
  • 如何递归取消引用指针(C++03)?

    我正在尝试在 C 中递归地取消引用指针 如果传递一个对象 那就是not一个指针 这包括智能指针 我只想返回对象本身 如果可能的话通过引用返回 我有这个代码 template
  • 在 C# 中为父窗体中的子窗体控件添加事件处理程序

    我有两种形式 一种是带有按钮和文本框的父表单 单击该按钮时 将打开一个对话框 该子窗体又包含一个文本框和一个按钮 现在我想要的是 每当子表单文本框中的文本更改时 父表单文本框中的文本会自动更改 为了获得这个 我所做的是 Form3 f3 n
  • C++ - 多维数组

    处理多维数组时 是否可以为数组分配两种不同的变量类型 例如你有数组int example i j 有可能吗i and j是两种完全不同的变量类型 例如 int 和 string 听起来您正在寻找 std vector
  • 将二变量 std::function 转换为单变量 std::function

    我有一个函数 它获取两个值 x 和 y 并返回结果 std function lt double double double gt mult double x double y return x y 现在我想得到一个常量 y 的单变量函数
  • Oauth2中如何同时撤销RefreshToken和使AccessToken失效

    我正在使用 Owin Oauth2 授权和资源服务器相同 开发单页面应用程序 AngularJS Net MVC Json Rest API 的身份验证流程 我选择了 Bearer Token 路由而不是传统的 cookie session
  • 模板类中的无效数据类型生成编译时错误?

    我正在使用 C 创建一个字符串类 我希望该类仅接受数据类型 char 和 wchar t 并且我希望编译器在编译时使用 error 捕获任何无效数据类型 我不喜欢使用assert 我怎样才能做到这一点 您可以使用静态断言 促进提供一个 ht
  • 使动态创建的链接标签在 Winforms 中可点击

    我正在制作一个程序 允许用户单击由动态链接标签创建的公司名称 在我想知道如何做到这一点之前 我从未在 C 中使用过链接标签 可为特定用户生成的业务数量各不相同 因此每个用户的链接标签数量并不相同 然后我想捕获业务 ID 以进行 Json 调
  • Visual Studio 2015:v120 与 v140?

    仅供参考 Win10 x64 我今天开始尝试 Visual Studio 2015 在弄清楚如何运行 C C 部分后 我尝试加载一个大型个人项目 该项目使用非官方的glsdk http glsdk sourceforge net docs
  • WPF DataGrid / ListView 绑定到数组 mvvm

    我们假设你有 N 个整数的数组 表示行数的整数值 在模型中 该整数绑定到视图中的 ComboBox Q1 如何将数组 或数组的各个项目 绑定到 DataGrid 或 ListView 控件 以便 当您更改 ComboBox 值时 只有那么多
  • 当用户更改 Windows 中的语言键盘布局时如何通知?

    I want to show a message to user when the user changes the language keyboard layout of Windows for example from EN to FR
  • 如何在 C 中将 char 连接到 char* ?

    我怎样才能前置char c to char myChar 我有c值为 A and myChar值为 LL 我怎样才能前置c to myChar使 ALL 这应该有效 include

随机推荐

  • 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 因为它们都要求窗口成为顶部活动窗口 但在我的情况下