用C#和远程桌面问题捕获屏幕

我有一个C尖锐的控制台应用程序捕获多次MS Word文档的屏幕截图。 它工作的很好,但是当我把这个应用程序在远程的Windows XP机器上,它工作正常,而我在远程即我的远程桌面是可见的,但如果我运行我的应用程序,离开远程桌面(尽量减less,甚至没有注销,我想做 )截图需要的是空白的!

屏幕截图应用程序由作为SYSTEM用户运行的服务运行。

即使在没有用户连接的情况下,我如何保持GUI的活动状态?

这是我使用的代码:

public Image CaptureWindow(IntPtr handle) { // get te hDC of the target window IntPtr hdcSrc = User32.GetWindowDC(handle); // get the size User32.RECT windowRect = new User32.RECT(); User32.GetWindowRect(handle, ref windowRect); int width = windowRect.right - windowRect.left; int height = windowRect.bottom - windowRect.top; // create a device context we can copy to IntPtr hdcDest = GDI32.CreateCompatibleDC(hdcSrc); // create a bitmap we can copy it to, // using GetDeviceCaps to get the width/height IntPtr hBitmap = GDI32.CreateCompatibleBitmap(hdcSrc, width, height); // select the bitmap object IntPtr hOld = GDI32.SelectObject(hdcDest, hBitmap); // bitblt over GDI32.BitBlt(hdcDest, 0, 0, width, height, hdcSrc, 0, 0, GDI32.SRCCOPY); // restore selection GDI32.SelectObject(hdcDest, hOld); // clean up GDI32.DeleteDC(hdcDest); User32.ReleaseDC(handle, hdcSrc); // get a .NET image object for it Image img = Image.FromHbitmap(hBitmap); // free up the Bitmap object GDI32.DeleteObject(hBitmap); return img; } 

更新

我目前正在使用PrintWindow,它是唯一能够捕捉窗口框架(即最小化,最大化和closuresbutton),但内部是黑色的最接近的东西。

虽然它没有完全奏效,但它certificate了我可以从窗口手柄创build一个图像,而应用程序甚至不能被用户看到。

前一段时间我们正在做类似的事情,我们发现,当RDC最小化时,远程桌面会话不会重绘或接受键或鼠标事件。 一切工作正常,直到我们最小化了RDC屏幕。 一位同事发现,这是出于性能原因。

前几天我偶然发现了这个,但是我没有机会尝试。 如果你尝试它的工作,请让我知道:)

RDC最小化时与远程桌面进行交互

关于您的意见:我认为这是另一种问题…我知道,即使没有人登录到计算机上,您也需要您的应用程序工作。 我已经实现了允许与桌面交互的服务,例如,启动应用程序并使其自动化。 即使没有人登录到本机,您仍然可以使用UI自动化库(或者您的代码)来操作UI。

启动机器后,当我的服务和自动化应用程序运行时,一切正常。 稍后,被自动化的用户界面会出现在登录的第一个人的桌面上(我是一名机器管理员,我不知道有什么权限登录的人会发生什么事情)。

我不知道如果第一次登录是通过RDC完成会发生什么。 也许你可以尝试改变这些RDC设置id,这会影响你的应用程序的行为。 另一个选择是:

  1. 禁用RDC并使用指定的帐户将窗口配置为自动登录
  2. 使用其他远程桌面应用程序连接到本机(例如TightVNC)

这有帮助吗?