什么是SendMessage函数正确的声明,以及如何将我的代码中使用它的参数?(What is th

2019-10-18 02:03发布

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

如何找出参数来使用,这样我可以切换到其他的申报?

Answer 1:

看看头文件或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位之间可以移植要小心。



Answer 2:

基尔斯滕,这是一个互操作的问题。 大多数C ++样品指定的SendMessage的参数整数或的uint; 顺便C#将其解释值不真的没有,只要关系

  • 你通过比特模式是正确的
  • 尺寸是正确的
  • 编组是适当的

实际上,有相当多来在这里交手,太多的堆栈溢出的答案。 你需要与谷歌的词是“互操作”和“编组”。

你也应该知道,你可能有问题,发送消息的跨进程,除非发送者提升权限。 和SendMessage消息是同步的。 你确定你不想PostMessage的?



文章来源: What is the correct declaration for SendMessage and how do I convert my code to use its parameters?