调用 SendMessage (P/Invoke) 不断崩溃

2023-12-14

我必须编写一个与第三方程序通信的应用程序(AOL, 对不起。 :()

做了很多研究,我发现了一些方法来做到这一点P/Invoke,并且在很大程度上它works好的,但它会在后续试验中崩溃,特别是SendMessage。我在下面概述了崩溃的代码。

所有这些都被移植到.NET来自旧的、旧的 Visual Basic 文件。它可能已经过时了,如果它不可行,我也能理解 - 我只是希望有一种比 Visual Basic 4.0 更好的方法来完成这项工作。

[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool CloseHandle(IntPtr hObject);

[DllImport("user32.dll", SetLastError = true)]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

[DllImport("user32.dll", SetLastError = true)]
public static extern IntPtr FindWindowEx(IntPtr hwndParent,
                                         IntPtr hwndChildAfter,
                                         string lpszClass,
                                         string lpszWindow);

[DllImport("user32.dll", SetLastError = true)]
public static extern IntPtr FindWindowEx(IntPtr parentHandle,
                                         IntPtr childAfter,
                                         string className,
                                         IntPtr windowTitle);

[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr SendMessage(HandleRef hWnd,
                                        UInt32 Msg,
                                        IntPtr wParam,
                                        IntPtr lParam);

[DllImport("user32.dll", EntryPoint="SendMessageW")]
public static extern IntPtr SendMessageByString(HandleRef hWnd,
                                                UInt32 Msg,
                                                IntPtr wParam,
                                                StringBuilder lParam);

[DllImport("user32.dll", CharSet = CharSet.Unicode , EntryPoint = "SendMessageW")]
public static extern IntPtr SendMessageByString(HandleRef hWnd,
                                                UInt32 Msg,
                                                IntPtr wParam,
                                                String lParam);

public IntPtr FindClientWindow()
{
    IntPtr aol = IntPtr.Zero;
    IntPtr mdi = IntPtr.Zero;
    IntPtr child = IntPtr.Zero;
    IntPtr rich = IntPtr.Zero;
    IntPtr aollist = IntPtr.Zero;
    IntPtr aolicon = IntPtr.Zero;
    IntPtr aolstatic = IntPtr.Zero;

    aol = Invoke.FindWindow("AOL Frame25", null);
    mdi = Invoke.FindWindowEx(aol, IntPtr.Zero, "MDIClient", null);
    child = Invoke.FindWindowEx(mdi, IntPtr.Zero, "AOL Child", null);
    rich = Invoke.FindWindowEx(child, IntPtr.Zero, "RICHCNTL", null);
    aollist = Invoke.FindWindowEx(child, IntPtr.Zero, "_AOL_Listbox", null);
    aolicon = Invoke.FindWindowEx(child, IntPtr.Zero, "_AOL_Icon", null);
    aolstatic = Invoke.FindWindowEx(child, IntPtr.Zero, "_AOL_Static", null);

    if (rich != IntPtr.Zero &&
        aollist != IntPtr.Zero &&
        aolicon != IntPtr.Zero &&
        aolstatic != IntPtr.Zero)

        return child;
    do
    {
        child = Invoke.FindWindowEx(mdi, child, "AOL Child", null);
        rich = Invoke.FindWindowEx(child, IntPtr.Zero, "RICHCNTL", null);
        aollist = Invoke.FindWindowEx(child, IntPtr.Zero, "_AOL_Listbox", null);
        aolicon = Invoke.FindWindowEx(child, IntPtr.Zero, "_AOL_Icon", null);
        aolstatic = Invoke.FindWindowEx(child, IntPtr.Zero, "_AOL_Static", null);

        if (rich != IntPtr.Zero &&
            aollist != IntPtr.Zero &&
            aolicon != IntPtr.Zero &&
            aolstatic != IntPtr.Zero)

            return child;
    }
    while (child != IntPtr.Zero)
        ;

    return child;
}

IntPtr room = IntPtr.Zero;
IntPtr child = IntPtr.Zero;
IntPtr length = IntPtr.Zero;
IntPtr roomHandle = IntPtr.Zero;

child = FindClientWindow();
room = FindChildByClass(child, "RICHCNTLREADONLY");

HandleRef n = new HandleRef(IntPtr.Zero, room);

length = SendMessage(n, 0x000E, IntPtr.Zero, IntPtr.Zero);

// This is the line that keeps crashing on me.
SendMessageByString(n, 0x000D, new IntPtr( length.ToInt32() + 1 ), str);

public IntPtr FindChildByClass(IntPtr parent, string child)
{
    return Invoke.FindWindowEx(parent, IntPtr.Zero, child, null);
}

您正在使用宽字节 SendMessage..ie 来表示宽字符,您是否尝试过普通的 Sendmessage..public static extern int SendMessage(IntPtr hWnd, UInt32 Msg, Int32 wParam, Int32 lParam);

我还注意到,就好像您试图根据 richtextbox 控件的句柄更改值,因此在另一个进程中查找 AOL 的客户端窗口......这是正确的吗?

这可能是问题的根源,直接修改属于不属于您的窗口的控件(您的程序是托管的,修改非托管进程的窗口)......这可以解释它崩溃的原因。您能澄清一下十六进制常量的用途吗?

Edit:当您使用 WM_GETTEXTLENGTH 和 WM_GETTEXT 时,它们是 Windows 消息的一部分,用于从控件中检索文本长度和实际文本。如果你看here并查看 pinvoke.net 对它们的评价。当您使用 WM_GETTEXTLENGTH 和 WM_GETTEXT 发出“SendMessage”时,您是在告诉 Windows - '嘿,请告诉我我给出的关联句柄中的文本长度你在参数中n。我突然想到,值得尝试...我会摆脱那些 SendMessage pinvokes 并只使用这个..



[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, StringBuilder lParam);
//If you use '[Out] StringBuilder', initialize the string builder with proper length first.
  



child = FindClientWindow();
room = FindChildByClass(child, "RICHCNTLREADONLY");

length = SendMessage(n, 0x000E, IntPtr.Zero, IntPtr.Zero);

StringBuilder sbBuf = new StringBuilder(length);

SendMessageByString(room, 0x000D, new IntPtr( length.ToInt32() + 1 ), out sbBuf); // this is the line that keeps crashing on me.
  

尝试一下然后回到这里...:)

希望这可以帮助, 此致, 汤姆.

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

调用 SendMessage (P/Invoke) 不断崩溃 的相关文章

  • 如何读取扩展文件属性/文件元数据

    因此 我按照教程使用 ASP net core 将文件 上传 到本地路径 这是代码 public IActionResult About IList
  • C++ 中本地类中的静态成员变量?

    我知道我们不能宣布static本地类中的成员变量 但其原因尚不清楚 那么请问有人可以解释一下吗 另外 为什么我们不能访问非static函数内部定义的变量 内部已经定义了局部类 直接在局部类成员函数中 在下面给出的代码中 int main i
  • Unix网络编程澄清

    我正在翻阅这本经典书籍Unix网络编程 https rads stackoverflow com amzn click com 0139498761 当我偶然发现这个程序时 第 6 8 节 第 179 180 页 include unp h
  • 为 Visual Studio 2013 编译 Tesseract

    我正在尝试使用tesseract在 Visual Studio 2013 中 我在链接器 gt 输入 不是 libtesseract302 static lib 中使用 libtesseract302 lib 一切都正常 并且已编译并运行
  • 如何将 #ifdef DEBUG 添加到 Xcode?

    我的项目中有一些代码永远不应该在发布版本中使用 但在测试时很有用 我想做这样的事情 ifdef DEBUG Run my debugging only code endif 在 Xcode 4 中哪里添加 DEBUG 设置 我尝试将其放入
  • 将内置类型转换为向量

    我的 TcpClient 类接受vector
  • 生成(非常)大的非重复整数序列而不进行预洗牌

    背景 我编写了一个简单的媒体客户端 服务器 我想生成一个不明显的时间值 随从客户端到服务器的每个命令一起发送 时间戳中将包含相当多的数据 纳秒分辨率 即使它不是真正准确 因为现代操作系统中计时器采样的限制 等 我想做的 在 Linux 上
  • 用于检查项目文件中的项目变量和引用路径的 api

    我正在研究一个 net application VS2010 与 x 没有 解和变量号这些解决方案中的项目数量 我需要检查项目属性 特定于一定数量的项目 是否同质 并且检查 验证构建期间的参考路径 有没有一个API是这样的吗 如果没有 我该
  • 使用 C 语言使用 strftime() 获取缩写时区

    我看过this https stackoverflow com questions 34408909 how to get abbreviated timezone and this https stackoverflow com ques
  • 如何在 Linq 中获得左外连接?

    我的数据库中有两个表 如下所示 顾客 C ID city 1 Dhaka 2 New york 3 London 个人信息 P ID C ID Field value 1 1 First Name Nasir 2 1 Last Name U
  • 未定义的行为或误报

    我 基本上 在野外遇到过以下情况 x x 5 显然 它可以在早期版本的 gcc 下编译干净 在 gcc 4 5 1 下生成警告 据我所知 警告是由 Wsequence point 生成的 所以我的问题是 这是否违反了标准中关于在序列点之间操
  • 未经许可更改内存值

    我有一个二维数组 当我第一次打印数组的数据时 日期打印正确 但其他时候 array last i 的数据从 i 0 到 last 1 显然是一个逻辑错误 但我不明白原因 因为我复制并粘贴了 for 语句 那么 C 更改数据吗 I use g
  • Visual Studio 中的测试单独成功,但一组失败

    当我在 Visual Studio 中单独运行测试时 它们都顺利通过 然而 当我同时运行所有这些时 有些通过 有些失败 我尝试在每个测试方法之间暂停 1 秒 但没有成功 有任何想法吗 在此先感谢您的帮助 你们可能有一些共享数据 检查正在使用
  • 将 log4net 与 Autofac 结合使用

    我正在尝试将 log4net 与 Autofac 一起使用 我粘贴了这段代码http autofac readthedocs org en latest examples log4net html http autofac readthed
  • 如何对 Web Api 操作进行后调用?

    我创建了一个 Web API 操作 如下所示 HttpPost public void Load string siteName string providerName UserDetails userDetails implementat
  • .NET中的LinkedList是循环链表吗?

    我需要一个循环链表 所以我想知道是否LinkedList是循环链表吗 每当您想要移动列表中的 下一个 块时 以循环方式使用它的快速解决方案 current current Next current List First 电流在哪里Linke
  • 如何在按钮单击时模拟按键 - Unity

    我对 Unity 中的脚本编写非常陌生 我正在尝试创建一个按钮 一旦单击它就需要模拟按下 F 键 要拾取一个项目 这是我当前的代码 在编写此代码之前我浏览了所有统一论坛 但找不到任何有效的东西 Code using System Colle
  • memset 未填充数组

    u32 iterations 5 u32 ecx u32 malloc sizeof u32 iterations memset ecx 0xBAADF00D sizeof u32 iterations printf 8X n ecx 0
  • 防止在工厂方法之外实例化对象

    假设我有一个带有工厂方法的类 class A public static A newA Some code logging return new A 是否可以使用 a 来阻止此类对象的实例化new 那么工厂方法是创建对象实例的唯一方法吗 当
  • 在客户端系统中安装后桌面应用程序无法打开

    我目前正在使用 Visual Studio 2017 和 4 6 1 net 框架 我为桌面应用程序创建了安装文件 安装程序在我的系统中完美安装并运行 问题是安装程序在其他计算机上成功安装 但应用程序无法打开 edit 在客户端系统中下载了

随机推荐

  • applicationContextProvider 未被调用

    我使用的是Spring 3 0 3 我想使用 applicationContextProvider 所以我声明
  • 如何在android中的EditText的错误文本中写入样式?

    我正在尝试为我的 Android 应用程序编写新的自定义样式 我需要为设置后出现的 errorText 提供样式setError in EditText 我怎样才能定制它的风格 例如 我想设置它background白色和textColor
  • NumPy odeint 输出额外变量

    在仿真过程中保存中间变量的最简单方法是什么odeint在 Numpy 中 例如 def dy y t x np rand 3 1 return y x sum sim odeint dy 0 np arange 0 1 0 1 保存存储在中
  • R:找出工作日的差异

    计算工作日中的日期差异时遇到问题 即排除周末 如 Excel 中的网络日函数 这是我的数据 e lt structure list date pr structure c 15909 15933 16517 15961 15974 1597
  • Google Drive API 限制导出下载 10 mb 的策略

    我们一直在开发一个解决方案 负责生成嵌入大量图像的 PPT 然后通过 Google Slides 和 Google Drive API 在浏览器中下载 因此 我们在项目进行到一半时发现 从 Google Drive API 导出文件存在限制
  • MvcContrib TestHelper Fluent 路由测试和特定 HttpVerbs 的问题

    我正在尝试使用 MvcContrib TestHelper 流畅的路由测试 API 但我看到了奇怪的行为 WithMethod HttpVerb 扩展方法似乎没有按预期执行 这是我的控制器 显示了接受不同 HttpVerbs 的 2 个操作
  • 即使长度为 1,也返回正确的 .length

    如果我做一个 services Get Service services length 我得到126服务 但如果我指定一项服务 services Get Service Name vds services length 我什么也没得到 这搞
  • 避免鼠标移动的 QGraphicsItem 形状发生碰撞

    引发了一场有趣的讨论here关于防止 QGraphicsScene 中由 QGraphicsEllipseItems 组成的圆发生碰撞 问题将范围缩小到两个相互冲突的项目 但更大的目标仍然存在 对于任意数量的碰撞怎么办 这是期望的行为 当一
  • 如何用 BufferedImage 中的另一种颜色替换颜色

    所以我有一个图像文件 上面有一座火山 其他都是 0xFFFF00FF 不透明洋红色 我想用 0 透明 替换包含该颜色的每个像素 到目前为止我的方法如下所示 public static BufferedImage replace Buffer
  • “参数列表太长”限制是否适用于 shell 内置函数?

    我浏览过很多postsStack Overflow 以及一些相关社区argument list too long主题 我似乎不清楚长度限制是否适用于 shell 内置函数 假设我想通过标准输入将一个很长的字符串传递给命令 string a
  • 404 未找到资源:具有 Google Directory API 的域

    我按照快速入门进行操作 并尝试使用 google api ruby client 创建用户 我已经在 google api 控制台中设置了访问权限 我可以使用 API 浏览器让它工作 但是当我尝试使用 ruby 客户端时 我收到一个资源未找
  • 如何使用 postdata preSigned Url 调用 Amazon S3 存储桶以使用 Karate 上传文件

    我有一个 Amazon S3 的 postdata 预签名 URL 我想在空手道功能文件中使用它来上传文件 例如 pdf 这是我需要使用空手道 POST 请求执行的示例 Curl 请求 curl location request POST
  • 使用 REST api 创建新的团队项目

    整个星期我一直在努力反对这个问题 使用 REST api 创建新的团队项目 无论我看哪里 响应都是相同的 并且总是涉及使用命令行和 xml But why 在 Visual Studio 在线页面上可以找到 https www visual
  • 如何为新的训练模型初始化coef_init和intercept_init?

    正如这里所指定的 https stackoverflow com a 35662770 5757129 我存储了第一个模型的系数和截距 后来 我将它们作为初始化程序传递给我的第二个 fit 如下所示 以便在旧模型之上学习新数据 from s
  • 我想当用户单击 android 中的后退按钮时结束整个应用程序

    我想当用户单击 android Currently 中的后退按钮时结束整个应用程序 当前它再次转到以前打开的活动 我也尝试重写 onBackPressed 但它不起作用 public boolean onKeyDown int keyCod
  • 如何在控制器创建上添加外键值

    我有一个简单的数据库 用户可以在其中创建任务 我希望索引页显示哪些用户创建了哪些任务 任务和用户之间的关系是1个用户对应多个任务 该任务有一个 user id 外键 用户只有通过 Devise 登录后才能创建任务 我的创建控制器如下 但我不
  • 如何更改 EditText 选择手柄/锚点的颜色/外观?

    所以我改变了 Holo 主题的风格全息颜色生成器 and 操作栏样式生成器到我自己的颜色 但是当我在编辑文本中选择文本时 所选位置的 标记 仍然是蓝色的 我怎样才能改变它 这里最糟糕的部分是找到该项目的 名称 以及它在主题内的调用方式 所以
  • 如何配置 @PreAuthorize 来识别我登录用户的 ID?

    我正在尝试创建一个 Spring Boot 2 1 应用程序 我创建了以下休息控制器 RestController RequestMapping api users public class UserController PutMappin
  • MySql、Postgres、Oracle 和 SQLServer 忽略 IS NOT NULL 过滤器

    当我准备回答 SO 上的一位同事时 我遇到了一种奇怪的情况 至少对我来说是这样 原来的问题在这里 数据透视表忽略具有空值的行 我已经修改了查询以使用max代替group concat为了显示所有数据库中的 问题 SELECT id max
  • 调用 SendMessage (P/Invoke) 不断崩溃

    我必须编写一个与第三方程序通信的应用程序 AOL 对不起 做了很多研究 我发现了一些方法来做到这一点P Invoke 并且在很大程度上它works好的 但它会在后续试验中崩溃 特别是SendMessage 我在下面概述了崩溃的代码 所有这些