2

我想创建一个程序,可以制作滚动窗口的屏幕截图。与制作屏幕截图相反,滚动另一个应用程序对我来说很困难。基于网络上的一些脚本,我写了:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.Threading;

namespace scroller
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }


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

    [DllImport("user32.dll")]
    static extern int SetScrollPos(IntPtr hWnd, int nBar, int nPos, bool bRedraw);

    [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);

    [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);

    [DllImport("User32.Dll", EntryPoint = "PostMessageA")]
    static extern bool PostMessage(IntPtr hWnd, uint msg, int wParam, int lParam);

    [DllImport("user32.dll")]
    private static extern IntPtr GetForegroundWindow();

    [DllImport("user32.dll")]
    static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count);

    internal delegate int WindowEnumProc(IntPtr hwnd, IntPtr lparam);

    [DllImport("user32.dll")]
    internal static extern bool EnumChildWindows(IntPtr hwnd, WindowEnumProc func, IntPtr lParam);


    private void Form1_Load(object sender, EventArgs e)
    {

        List<IntPtr> result = new List<IntPtr>();

        Thread.Sleep(5000);

        IntPtr ParenthWnd = GetForegroundWindow();
        if (!ParenthWnd.Equals(IntPtr.Zero))
        {
            StringBuilder myStringBuilder = new StringBuilder(256);
            GetWindowText(ParenthWnd, myStringBuilder, 256);
            this.Text = myStringBuilder.ToString();

            IntPtr prevChild = IntPtr.Zero;
            IntPtr currChild = IntPtr.Zero;
            while (true)
            {
                currChild = FindWindowEx(ParenthWnd, prevChild, null, null);
                if (currChild == IntPtr.Zero) break;
                result.Add(currChild);
                prevChild = currChild;
            }
        }
        for(int i=0 ;i<=result.Count-1;i++){
        IntPtr myHandle = result[i];
        SetActiveWindow(ParenthWnd);
        SwitchToThisWindow(myHandle, true);
        SetScrollPos(myHandle, 0x1, 0, true);
        PostMessage(myHandle, 0x115, 4 + 0x10000 * 0,0);
        }

    }        
}
}

这会等待 5 秒,然后将所有窗口的滚动条移到顶部。它适用于例如记事本,但不适用于网络浏览器、ms word 等。我究竟做错了什么?

4

0 回答 0