如何在我的表单中获取记事本的ScrollBar位置

时间:2010-06-27 14:02:29

标签: c#

我在获取滚动条位置时遇到问题。是否可以获取另一个进程的滚动条位置,例如记事本。我在我测试的地方写了一个小应用程序,总是得到0 0作为滚动条的位置。

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern int GetScrollPos(IntPtr hWnd, int nBar);

    [DllImport("user32.dll")]
    static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

    [DllImport("user32.dll")]
    static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);

    [DllImport("user32.dll", SetLastError = true)]
    private static extern bool MoveWindow(IntPtr hwnd, int x, int y, int cx, int cy, bool repaint);

    [DllImport("user32.dll")]
    static extern IntPtr SetActiveWindow(IntPtr hWnd);

    [DllImport("user32.dll", SetLastError = true)]
    static extern void SwitchToThisWindow(IntPtr hWnd, bool fAltTab);


    private void Form1_Load(object sender, EventArgs e)
    {
        this.SuspendLayout();

        Process notepad = new Process();
        ProcessStartInfo psi = new ProcessStartInfo(@"c:\list1.txt");
        psi.WindowStyle = ProcessWindowStyle.Normal;
        notepad.StartInfo = psi;

        notepad.Start();

        this.ResumeLayout();

        notepad.WaitForInputIdle(3000);

        IntPtr old = SetParent(notepad.MainWindowHandle, this.Handle);

        SetWindowLong(notepad.MainWindowHandle, GWL_STYLE, WS_VISIBLE + WS_MAXIMIZE);
        MoveWindow(notepad.MainWindowHandle, 100, 100, 400, 400, true);

        SetActiveWindow(notepad.MainWindowHandle);
        SwitchToThisWindow(notepad.MainWindowHandle, true);            
    }

我有把PGDN事件发送到记事本的按钮,它工作得很好但滚动条的pgdn事件位置也是0 0

    private void PGDN_Click(object sender, EventArgs e)
    {
        Process[] procs = Process.GetProcessesByName("Notepad");
        IntPtr hwnd = procs[0].MainWindowHandle;

        SetActiveWindow(hwnd);
        SwitchToThisWindow(hwnd, true);
        Thread.Sleep(2000);
        SendKeys.SendWait("{PGDN}");
        Thread.Sleep(2000);
        label1.Text = "OK";
        label1.Text = "";

        label1.Text =  HScrollPos().ToString() + "  " + VScrollPos().ToString(); }

以下是HScrollPos和VScrollPos函数:

    public int VScrollPos()
    {
        Process[] procs = Process.GetProcessesByName("Notepad");
        IntPtr hwnd = procs[0].MainWindowHandle;
        if (procs.Length != 0)
        {
            return GetScrollPos(hwnd , SB_VERT);

        }
        else
        {
            MessageBox.Show("Notepad Nor Running");
            return 0;
        }      
    }

    public int HScrollPos()
    {
        Process[] procs = Process.GetProcessesByName("Notepad");
        IntPtr hwnd = procs[0].MainWindowHandle;
        if (procs.Length != 0)
        {

            return GetScrollPos(hwnd , SB_HORZ);
        }
        else
        {
            MessageBox.Show("Notepad Nor Running");
            return 0;
        }            
    }

也许还有另一种方法可以在Windows中获取另一个进程/窗口的滚动条位置?请帮忙。这是理所当然的。

这是基于答案的工作代码。 THX

    [DllImport("user32.dll", SetLastError = true)]
    private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

    [DllImport("user32.dll", SetLastError = true)]
    static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);

    private void button4_Click(object sender, EventArgs e)
    {
        string lpszParentClass = "Notepad";
        string lpszParentWindow = "Untitled - Notepad";
        string lpszClass = "Edit";

        IntPtr ParenthWnd = new IntPtr(0);
        IntPtr hWnd = new IntPtr(0);
        ParenthWnd = FindWindow(lpszParentClass, lpszParentWindow);
        if (ParenthWnd.Equals(IntPtr.Zero))
            MessageBox.Show("Notepad Not Running");
        else
        {
            hWnd = FindWindowEx(ParenthWnd, hWnd, lpszClass, "");
            if (hWnd.Equals(IntPtr.Zero))
                  MessageBox.Show("Notepad doesn't have an edit component ?");
            else
            {
                MessageBox.Show("Notepad Window: " + ParenthWnd.ToString());
                MessageBox.Show("Edit Control: " + hWnd.ToString());
            }
        }
        SetActiveWindow(ParenthWnd);
        label5.Text = GetScrollPos(hWnd, SB_VERT) + "   " + GetScrollPos(hWnd, SB_HORZ);
    }

1 个答案:

答案 0 :(得分:2)

我怀疑问题是你正在使用主窗口句柄,你应该使用Edit控件的句柄,它是主窗口的子句。

使用主窗口hwnd,您可以enumrate the child windows找到编辑控件的hWnd,然后在调用中使用该hWnd来获取滚动条位置。

SendKeys正在工作,因为它将关键笔划发送到具有输入焦点的窗口,在这种情况下是Edit控件。

Here是我在某个时候提供的问题的答案,如果你需要,它将有助于EnumChildWindows的互操作,还有更多,但它可能会有所帮助。