1

NativeWindowから継承したクラスを使用して、マネージドCOMサーバーからアンマネージドステータスバーウィンドウをサブクラス化しようとしていますが、lParamのコンテンツを適切にマーシャリングする方法を理解しようとして壁にぶつかっています。

http://msdn.microsoft.com/en-us/library/bb760757%28VS.85%29.aspxによると、このlParamの内容はタイプ(LPARAM)(LPINT) aWidthsであり、この変数の内容は実際には「整数配列。」

これを正しくマーシャリングする方法がわかりません。目標は、lParamを読み取り、値を配列に追加してから、を介して新しいメッセージを送信することbase.wndProc(ref m)です。

できればいいのですint[] array = (int[])m.*lParamが、人生はそれほど単純ではありません(そして、安全でないコードを使用することはできません)。私は不器用にマーシャラーに何かを介して私に何かを与えるように強制しようとしましたMarshal.PtrToStructure()が、C配列は構造体ではなく、私が作成しようとした構造体は明らかにブリット可能ではないため、これは最初から運命づけられていることを知っていました。

現在、元の呼び出しを通過させてから、追加のWinAPI呼び出しを行って配列を取得し、フォーマットしてから、ステータスバーを再描画する前に再送信しています。これはうまく機能していますが、十分ではありません。

何か案は?

ありがとう!

トム

PS-私はlParamsがC#でどのように使用されているかを理解するのに多くの問題を抱えていました、ドキュメントはかなり混乱しています:-/

4

1 に答える 1

3

「dtb」のコメントに続いて、このSOエントリからいくつかのコードを借りることができます。

提供する必要のあるLPARAMは、配列の最初の要素へのポインターです。次に、あなたがしなければならないのは:

int[] parts = new int[]{ 1, 2, 3, 4 };
int nParts = parts.Length;
IntPtr pointer = Marshal.AllocHGlobal(nParts * Marshal.SizeOf(typeof(int)));
for (int i = 0; i < nParts; i++) {
    Marshal.WriteInt32(pointer, i * Marshal.SizeOf(typeof(int), parts[i]));
}
// Call SendMessage with WPARAM = nParts and LPARAM = Pointer
Marshal.FreeHGlobal(pointer);
于 2010-01-08T10:36:40.790 に答える