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)
我如何确定要使用的参数,以便我可以切换到另一个声明?
查看头文件或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)
在IntPtr与UIntPtr有拿一个普通的整数,所以没有问题,可以直接调用它的构造函数:
NativeMethods.SendMessage(this.tv.Handle, 277, new UIntPtr(1), IntPtr.Zero);
Run Code Online (Sandbox Code Playgroud)
实际上,只要您尊重每个参数的大小,一切都会正常工作,但如果您希望代码可以在32位和64位之间移植,则必须小心.