Я создаю приложение WinForms, которое записывает шаги внешнего процесса, делая его скриншоты каждые 500 миллисекунд. Я использую следующий код:
Bitmap bmp = new Bitmap(width, height,PixelFormat.Format32bppArgb);
Graphics g = Graphics.FromImage(bmp);
g.CopyFromScreen(rect.left,
rect.top,
0,
0,
new Size(width, height),
CopyPixelOperation.SourceCopy);
Код работает нормально, но единственная проблема заключается в том, что когда я открываю диалоговое окно из окна внешнего процесса (например: Открытие Save As...
диалогового окна в Блокноте), скриншот зависает в исходном окне, а не отображается диалог коробка.
Моя теория заключается в том, что из-за следующего кода, который я использую, чтобы определить, потеряло ли приложение фокус, просто вернитесь к последнему сохраненному снимку экрана:
if (GetForegroundWindow() != proc.MainWindowHandle) //proc is just a process from system process list by Process.GetProcessesByName()
{
return LastScreenShot;
}
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
private static extern IntPtr GetForegroundWindow();
Но этот код необходим для отображения пользователю только приложения, которое записывается не на любое другое приложение, которое перетаскивается внутри области записи или части рабочего стола внутри области записи. Кроме того, когда я нажимаю меню, он иногда показывает, что меню застыло в затухающем положении, иногда не отображается вообще или показывается, но навигационная подсветка не отображается на скриншоте.
Как я могу решить эту проблему?
Здесь задается аналогичный вопрос Захват экрана не запечатлеет диалоговые окна в моем приложениино это не решает мою проблему, потому что ответ использует тот же код и мое приложение не снимает скриншот всего рабочего стола.