C# 使用WndProc消息以编程方式滚动文本框

C# 使用WndProc消息以编程方式滚动文本框,c#,winforms,C#,Winforms,我正在尝试使用表单的WndProc方法滚动文本框。到目前为止,我在搜索互联网后得出的代码如下所示: private void ScrollTextBox() { scrollMessage = Message.Create(TabContents.Handle, 0x00B6, new IntPtr(0x0003), new IntPtr(0x0000)); this.WndProc(ref scrollMessage); } 其中TabContents是一个文本框 由于某种原

我正在尝试使用表单的WndProc方法滚动文本框。到目前为止,我在搜索互联网后得出的代码如下所示:

private void ScrollTextBox()
{
    scrollMessage = Message.Create(TabContents.Handle, 0x00B6, new IntPtr(0x0003), new IntPtr(0x0000));
    this.WndProc(ref scrollMessage);
}
其中TabContents是一个文本框

由于某种原因,调用此方法时不会发生任何事情。我想知道为什么。我意识到我可以用MoveToCaret方法实现同样的效果,但我很好奇为什么这不起作用

编辑: 正如Beaner发布的答案一样,我使用SendMessage编写了另一个方法:

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp); 

        private void ScrollTextBox2(int lines)
        {
            SendMessage(TabContents.Handle, 0x00B6, new IntPtr(0), new IntPtr(lines));
        }

这似乎100%有效。我仍然很好奇为什么这个.WndProc(ref message)不起作用,因为一条消息是用相同的参数集创建的。

这是可能的,但我从未尝试过这种方法。我使用了SendMessage将windows消息直接发送到文本框以引起滚动

private const int WM_VSCROLL = 0x115;
private const int SB_BOTTOM = 7;

[DllImport("user32.dll", CharSet=CharSet.Auto)]
private static extern int SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam,
IntPtr lParam);

// Scroll to the bottom, but don't move the caret position.
SendMessage(TabContents.Handle, WM_VSCROLL, (IntPtr) SB_BOTTOM, IntPtr.Zero);

我在堆栈溢出上发现了这个问题:这可能解释了WndProc方法不起作用的原因。当不使用SendMessage时,消息似乎不会发送到windows内核。