SendMessage的正确声明是什么?如何转换我的代码以使用其参数?

时间:2013-04-29 01:25:54

标签: c# winapi interop dllimport sendmessage

我对各种声明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);

如何确定要使用的参数,以便切换到其他声明?

2 个答案:

答案 0 :(得分:7)

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

在您的情况下,实际的C原型是:

LRESULT WINAPI SendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);

相关的typedef是:

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位之间移植,则必须小心。

答案 1 :(得分:0)

克尔斯滕,这是一个互操作问题。大多数C ++示例为SendMessage的参数指定int或uint;只要

,C#解释该值的方式并不重要
  • 您传递的位模式是正确的
  • 尺寸正确
  • 编组是合适的

实际上有很多东西需要处理,对于堆栈溢出答案来说太多了。谷歌需要的词是“互操作”和“编组”。

您还应该知道,除非发件人具有提升的权限,否则您可能会在跨进程发送邮件时遇到问题。 SendMessage是同步的。你确定你不想要PostMessage吗?