1

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);

他の宣言に切り替えるために使用するパラメーターを特定するにはどうすればよいですか?

4

2 に答える 2

8

ヘッダー ファイルまたは 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 ビットの間で移植できるようにする場合は注意が必要です。

于 2013-04-29T01:33:50.797 に答える