我对各种声明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);
如何确定要使用的参数,以便切换到其他声明?
答案 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);
IntPtr
和UIntPtr
的构造函数采用普通整数,因此直接调用它没有问题:
NativeMethods.SendMessage(this.tv.Handle, 277, new UIntPtr(1), IntPtr.Zero);
实际上,只要您尊重每个参数的大小,一切都会正常工作,但如果您希望代码可以在32位和64位之间移植,则必须小心。
答案 1 :(得分:0)
实际上有很多东西需要处理,对于堆栈溢出答案来说太多了。谷歌需要的词是“互操作”和“编组”。
您还应该知道,除非发件人具有提升的权限,否则您可能会在跨进程发送邮件时遇到问题。 SendMessage是同步的。你确定你不想要PostMessage吗?