1

我正在尝试使用从 NativeWindow 继承的类从我的托管 COM 服务器子类化一个非托管状态栏窗口,并且正在尝试理解如何正确编组 lParam 的内容。

http://msdn.microsoft.com/en-us/library/bb760757%28VS.85%29.aspx说这个 lParam 的内容是 type (LPARAM)(LPINT) aWidths,这个变量的内容实际上是一个“指向整数数组。”

我想不出一种正确编组的方法。目标是读取 lParam,将我们的值添加到数组中,然后通过base.wndProc(ref m).

如果我能做到这一点会很好int[] array = (int[])m.*lParam,但生活并不是那么简单(而且我不会使用不安全的代码)。我笨拙地试图强迫编组器给我一些东西,Marshal.PtrToStructure()但我知道这从一开始就注定了,因为 C 数组不是结构,而且我试图制作的结构显然不是 blittable。

现在我们让原始调用通过,然后进行额外的 WinAPI 调用来获取数组,格式化它,然后在状态栏重新绘制之前重新发送它。这运作良好,但还不够好。

有任何想法吗?

谢谢!

汤姆

PS-我在 C# 中如何使用 lParams 时遇到了很多麻烦,文档很混乱:-/

4

1 回答 1

3

在“dtb”的注释之后,您可以从这个SO entry中借用一些代码。

您必须提供的 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 回答