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

Kir*_*eed 1 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);
}
Run Code Online (Sandbox Code Playgroud)

但是调用SendMessage的代码是

 NativeMethods.SendMessage(this.tv.Handle, 277, 1, 0);
Run Code Online (Sandbox Code Playgroud)

我如何确定要使用的参数,以便我可以切换到另一个声明?

rod*_*igo 8

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

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

LRESULT WINAPI SendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
Run Code Online (Sandbox Code Playgroud)

相关的typedef是:

typedef unsigned int UINT;
typedef LONG_PTR LPARAM;
typedef UINT_PTR WPARAM;
typedef LONG_PTR LRESULT;
Run Code Online (Sandbox Code Playgroud)

所以正确的C#声明将是:

[DllImport("user32.dll")]
public static extern IntPtr SendMessage(IntPtr hWnd, uint wMsg, 
                                UIntPtr wParam, IntPtr lParam);
Run Code Online (Sandbox Code Playgroud)

IntPtrUIntPtr有拿一个普通的整数,所以没有问题,可以直接调用它的构造函数:

NativeMethods.SendMessage(this.tv.Handle, 277, new UIntPtr(1), IntPtr.Zero);
Run Code Online (Sandbox Code Playgroud)

实际上,只要您尊重每个参数的大小,一切都会正常工作,但如果您希望代码可以在32位和64位之间移植,则必须小心.