SendMessage的正确声明是什么,以及如何转换代码以使用它的参数

本文关键字:代码 转换 参数 声明 是什么 SendMessage 何转换 | 更新日期: 2023-09-27 18:11:29

我对各种声明SendMessage感到困惑。我怎么知道哪个是正确的?

在我的c# winforms应用程序(Windows 7)中,我使用以下代码;

public class NativeMethods
{
    [DllImport("user32.dll")]
    // Currently uses 
    public static extern int SendMessage(IntPtr hWnd, uint wMsg, int wParam, int lParam);
    // Think I should probably be using 
    // public static extern int SendMessage(IntPtr hWnd, uint wMsg, UIntPtr wParam, IntPtr lParam);
}

但是调用SendMessage的代码是

 NativeMethods.SendMessage(this.tv.Handle, 277, 1, 0);

如何确定使用哪些参数才能切换到另一个声明?

SendMessage的正确声明是什么,以及如何转换代码以使用它的参数

查看头文件或MSDN文档,然后您需要一些外推。

在你的例子中,实际的C原型是:
LRESULT WINAPI SendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);

相关的类型定义为:

typedef unsigned int UINT;
typedef LONG_PTR LPARAM;
typedef UINT_PTR WPARAM;
typedef LONG_PTR LRESULT;
所以正确的c#声明应该是:
[DllImport("user32.dll")]
public static extern IntPtr SendMessage(IntPtr hWnd, uint wMsg, 
                                UIntPtr wParam, IntPtr lParam);

IntPtrUIntPtr具有接受普通整数的构造函数,因此直接调用它没有问题:

NativeMethods.SendMessage(this.tv.Handle, 277, new UIntPtr(1), IntPtr.Zero);

实际上,只要你尊重每个参数的大小,一切都可以工作,但如果你想让你的代码在32位和64位之间移植,你必须小心。

Kirsten,这是一个互操作问题。大多数c++示例都为SendMessage的参数指定了int或单位;c#如何解释这个值其实并不重要,只要

  • 你通过的位模式是正确的
  • 尺寸正确
  • 封送是合适的

实际上这里有很多东西需要处理,对于堆栈溢出的答案来说太多了。你在google上需要的词是"互操作"answers"编组"。

您还应该意识到,在跨进程发送消息时可能会遇到问题,除非发送方具有更高的权限。SendMessage是同步的。您确定不需要PostMessage吗?