我试图从窗口句柄检索滚动信息,但我一直得到 0 值。我采用这种方法是因为我的目标是捕获窗口的完整滚动屏幕截图。目的是实现自动滚动和图像捕获。虽然我已经成功实现了自动窗口滚动,但我遇到了不同窗口的滚动行为的变化。
例如,发送 100 的鼠标增量会导致 Chrome 滚动大约 70 像素,而 Visual Studio 滚动大约 110 像素。每个窗口似乎都表现出不同的滚动特征。因此,我当前的目标是使用滚动条计算滚动期间像素移动的精确量。然而,我在实现这个功能时遇到了困难。
// get scrollbar info
SCROLLINFO scrollinfo = new SCROLLINFO();
scrollinfo.cbSize = (uint)Marshal.SizeOf(scrollinfo);
scrollinfo.fMask = SIF_ALL; // Get all the scroll bar information.
bool horBar = GetScrollInfo1(windowHandle, SB_HORZ, out scrollinfo);
Console.WriteLine(horBar);
bool vertBar = GetScrollInfo1(windowHandle, SB_VERT, out scrollinfo);
Console.WriteLine(vertBar);
Console.WriteLine(scrollinfo.nPage + ", " + scrollinfo.nPos);
[DllImport("user32.dll")]
public static extern bool GetScrollInfo(IntPtr hWnd, int fnBar, ref SCROLLINFO lpsi);
使用前请确保正确初始化
SCROLLINFO
结构。
SCROLLINFO scrollinfo = new SCROLLINFO();
scrollinfo.cbSize = (uint)Marshal.SizeOf(typeof(SCROLLINFO));
scrollinfo.fMask = SIF_ALL; // or SIF_PAGE | SIF_POS, etc.
并处理
return
的GetScrollInfo
值:GetScrollInfo
函数返回一个布尔值,指示成功或失败。确保检查此返回值以确保确实正在检索滚动信息。
bool success = GetScrollInfo(windowHandle, SB_HORZ, ref scrollinfo);
if (success)
{
// Process scrollinfo here
}
else
{
// Handle error here
}
使用右滚动条常量:
fnBar
函数中的GetScrollInfo
参数指示您是否正在查询水平或垂直滚动条。确保您使用正确的常量值:SB_HORZ
表示水平滚动条,SB_VERT
表示垂直滚动条。