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

时间:2010-04-04 01:12:31

标签: c# winforms

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

private void ScrollTextBox()
{
    scrollMessage = Message.Create(TabContents.Handle, 0x00B6, new IntPtr(0x0003), new IntPtr(0x0000));
    this.WndProc(ref scrollMessage);
}

其中TabContents是一个TextBox。

出于某种原因,当我调用此方法时没有任何反应。我想知道为什么。我意识到我可以用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%。我仍然很好奇为什么this.WndProc(引用消息)不起作用,给定使用相同参数集创建的消息。

1 个答案:

答案 0 :(得分:2)

这可能是可能的,但我从未尝试过这种方式。我使用 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);