我通过各种声明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);
如何找出参数来使用,这样我可以切换到其他的申报?
看看头文件或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);
该IntPtr
和UIntPtr
有拿一个普通的整数构造,所以没有问题,可以直接调用它:
NativeMethods.SendMessage(this.tv.Handle, 277, new UIntPtr(1), IntPtr.Zero);
其实,一切只要你尊重每个参数的大小作品,但你如果你希望你的代码为32位和64位之间可以移植要小心。
基尔斯滕,这是一个互操作的问题。 大多数C ++样品指定的SendMessage的参数整数或的uint; 顺便C#将其解释值不真的没有,只要关系
- 你通过比特模式是正确的
- 尺寸是正确的
- 编组是适当的
实际上,有相当多来在这里交手,太多的堆栈溢出的答案。 你需要与谷歌的词是“互操作”和“编组”。
你也应该知道,你可能有问题,发送消息的跨进程,除非发送者提升权限。 和SendMessage消息是同步的。 你确定你不想PostMessage的?
文章来源: What is the correct declaration for SendMessage and how do I convert my code to use its parameters?