我试图从窗口句柄检索滚动信息,但我一直得到 0 值。我采用这种方法是因为我的目标是捕获窗口的完整滚动屏幕截图。目的是实现自动滚动和图像捕获。虽然我已经成功实现了自动窗口滚动,但我遇到了不同窗口的滚动行为的变化。
例如,发送 100 的鼠标增量会导致 Chrome 滚动大约 70 像素,而 Visual Studio 滚动大约 110 像素。每个窗口似乎都表现出不同的滚动特征。因此,我当前的目标是使用滚动条计算滚动期间像素移动的精确量。然而,我在实现这个功能时遇到了困难。
[Serializable, StructLayout(LayoutKind.Sequential)]
public struct SCROLLINFO
{
public uint cbSize;
public uint fMask;
public int nMin;
public int nMax;
public uint nPage;
public int nPos;
public int nTrackPos;
}
public enum ScrollInfoMask : uint
{
SIF_RANGE = 0x1,
SIF_PAGE = 0x2,
SIF_POS = 0x4,
SIF_DISABLENOSCROLL = 0x8,
SIF_TRACKPOS = 0x10,
SIF_ALL = (SIF_RANGE | SIF_PAGE | SIF_POS | SIF_TRACKPOS),
}
public enum SBOrientation : int
{
SB_HORZ = 0x0,
SB_VERT = 0x1,
SB_CTL = 0x2,
SB_BOTH = 0x3
}
// get scrollbar info
SCROLLINFO scrollinfo = new SCROLLINFO();
scrollinfo.cbSize = (uint)Marshal.SizeOf(typeof(SCROLLINFO));
scrollinfo.fMask = (uint)ScrollInfoMask.SIF_ALL; // or SIF_PAGE | SIF_POS, etc.
bool success = GetScrollInfo(hWnd, (int)SBOrientation.SB_VERT, ref scrollinfo);
if (success)
{
// Process scrollinfo here
}
else
{
// Handle error here
}
uint errorCode = GetLastError();
Console.WriteLine($"Failed to retrieve scroll info. Error code: {errorCode}");
[DllImport("user32.dll")]
public static extern bool GetScrollInfo(IntPtr hWnd, int fnBar, ref SCROLLINFO lpsi);
[DllImport("kernel32.dll")]
public static extern uint GetLastError();
从 GetScrollInfo 获取“False”
GetLastError() 返回 1447 错误代码
它可以在记事本窗口上运行...但不能在 Chrome、Firefox、Visual Studio 等上运行
“我本质上是想捕捉滚动屏幕截图。我有两个选择:
使用代码自动滚动内容并计算滚动距离(以像素为单位)。然后,我将捕获该特定部分并将其附加到图像中。
或者,我可以滚动预定义的高度。这样,例如,如果我滚动 100 个像素,我将捕获正好 100 个像素的图像。
我目前正在尝试选项 1,但到目前为止还没有成功。”