C# C:“编组a”;指向整型数组的指针;从SendMessage()LPRAM

C# C:“编组a”;指向整型数组的指针;从SendMessage()LPRAM,c#,api,pinvoke,marshalling,subclassing,C#,Api,Pinvoke,Marshalling,Subclassing,我试图使用从NativeWindow继承的类从托管COM服务器中对非托管statusbar窗口进行子类化,并试图弄清楚如何正确封送LPRAM的内容 表示此LPRAM的内容类型为(lParam)(LPINT)aWidths,并且此变量的内容实际上是“指向整数数组的指针” 我想不出一个正确处理这个问题的方法。目标是读取LPRAM,将值添加到数组中,然后通过base.wndProc(ref m)发送新消息 如果我可以int[]array=(int[])m.*lParam之类的东西就好了,但生活并不是那

我试图使用从NativeWindow继承的类从托管COM服务器中对非托管statusbar窗口进行子类化,并试图弄清楚如何正确封送LPRAM的内容

表示此LPRAM的内容类型为
(lParam)(LPINT)aWidths
,并且此变量的内容实际上是“指向整数数组的指针”

我想不出一个正确处理这个问题的方法。目标是读取LPRAM,将值添加到数组中,然后通过
base.wndProc(ref m)
发送新消息

如果我可以
int[]array=(int[])m.*lParam
之类的东西就好了,但生活并不是那么简单(我也不会使用不安全的代码)。我曾笨拙地试图通过
Marshal.PtrToStructure()
强迫封送员给我一些东西,但我知道这从一开始就注定了失败,因为C-array不是一个结构,我试图创建的结构显然不可blittable

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

有什么想法吗

谢谢

汤姆

PS-我在摸索LPARAM在C#中的使用方法时遇到了很多麻烦,文档非常混乱:-/

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

必须提供的LPRAM是指向数组第一个元素的指针。那么你所要做的就是:

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);
int[]parts=newint[]{1,2,3,4};
int nParts=零件长度;
IntPtr pointer=Marshal.AllocHGlobal(npart*Marshal.SizeOf(typeof(int));
对于(int i=0;i
serge_gubenko to的答案有什么不对?事实上,我忘记了答案中的代码内容。谢谢你再次提出这个问题。尽管如此,这个问题的答案却完全不同。。。。需要绘制的控件正在从可见区域中绘制。哎呀:-)你缺少了一个括号,我想这应该是固定的。