我正在windows.forms中制作一个程序,它控制浏览器并经常对浏览器进行截图(以检查浏览器在不同时间的状态)。然而,我的上级改变了主意,程序现在必须在锁定的电脑上运行(Windows,使用任务调度程序)。我已经为其他几个设备解决了这个问题,但我无法弄清楚浏览器的工作方式。
我正在尝试使用 Selenium 库和这段代码:
new DriverManager().SetUpDriver(new ChromeConfig());
var options = new ChromeOptions();
options.AddArgument("--disable-gpu");
options.AddArgument("disable-software-rasterizer");
var driver = new ChromeDriver(options);
driver.Navigate().GoToUrl(url);
...
// Capture a screenshot of the web page
Screenshot screenshot = ((ITakesScreenshot)driver).GetScreenshot();
// Convert the screenshot to a Bitmap
Bitmap bmp = new Bitmap(new MemoryStream(screenshot.AsByteArray));
但是,当电脑被锁定时,似乎无法截图(或者浏览器本身可能无法启动)。我尝试了“--headless”选项,但由于 CORS 违规而被阻止。我也尝试过 PuppeteerSharp,但被 DRM 阻止(我在该公司工作,我并不想做任何非法的事情),尝试截图如下:
Bitmap screenshot = new Bitmap(s.Bounds.Width, s.Bounds.Height, PixelFormat.Format32bppRgb);
for (int i = 0; i < 2; i++)
{
using (Graphics memoryGraphics = Graphics.FromImage(screenshot))
{
memoryGraphics.CopyFromScreen(s.Bounds.X, s.Bounds.Y, 0, 0, s.Bounds.Size, CopyPixelOperation.SourceCopy);
return screenshot;
}
}
但如果我理解正确的话,当电脑被锁定时,屏幕(如本代码中使用的)不存在。
任何人都可以帮助我或给我一些关于如何实现这一目标的建议吗?
当您锁定计算机时,Windows 会禁用 GPU 渲染,这会限制某些程序的功能,例如 Selenium 或在我的例子中的 SikuliX(即图像自动化)。这个问题绝对没有办法解决。
在我的 VM 中,我有以下 .bat 文件,用于保持 VM 桌面渲染打开:
@echo off
for /f "tokens=1,2,3 delims= " %%i in ('query session ^| findstr "Active"') do set SessionId=%%k
Tscon %SessionId% /Dest:console