gpt4 book ai didi

c# - Graphics.CopyFromScreen() 和 GetDC(0) 失败,返回 "The handle is invalid"

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:28:03 26 4
gpt4 key购买 nike

我有一个从本地计算机获取屏幕截图的应用程序。这多年来一直正常工作,直到一位同事突然向我报告他从我的应用程序中收到“句柄无效”错误。

此错误来自 Graphics.CopyFromScreen() 的 .NET 框架内部.

为了解决这个问题,我使用 GetDC(GetDesktopWindow()) 将此函数替换为 C++ 代码/GetDC(NULL)BitBlt()将屏幕复制到位图中。现在我得到了ERROR_INVALID_HANDLE .

这发生在 Windows 7 上。

那里发生了什么?我无法自行调查此问题,因为我无法重现该问题,而且我的同事在另一个国家/地区。

我在 Google 中搜索,很多人都报告了这个错误。但我发现的所有帖子都来自那些试图通过服务器上的 ASP 代码从客户端计算机截取屏幕截图的人。我不明白人们怎么会有从网站上捕获客户计算机的奇怪愿望。很明显,这是行不通的。

但我找不到任何一个案例,有人报告此问题的应用程序无法在应用程序本身运行的同一 session 中捕获同一台计算机的屏幕。

最佳答案

在与我的同事进行更多调查并向他提供可以尝试的想法后,他告诉我他通过远程桌面 session 启动我的应用程序。

远程桌面 session 创建了一个虚拟桌面(例如,您看到桌面墙纸丢失了)。

我告诉我的同事安装一个 VNC 客户端来远程控制计算机而不是远程桌面 session ,现在一切正常。他安装了 TightVNC,它使用 REAL 桌面用户 session ,而不是创建虚拟 session 并锁定机器屏幕。

因此,如果有人在截屏时收到“句柄无效”的报告,请询问您的用户是否使用远程桌面 session 。

要在代码中检测远程桌面 session ,您可以编写:

在 C++ 中:

if (GetSystemMetrics(SM_REMOTESESSION) > 0)
{
MessageBox(m_hWnd, L"This application may not work correctly in a remote desktop session", "Error", MB_ICONSTOP);
}

或在 C# 中:

if (System.Windows.Forms.SystemInformation.TerminalServerSession)
{
Messagebox.Show("This application may not work correctly in a remote desktop session");
}

请注意,该问题并非在所有计算机上都能重现。当我在自己的 Windows 7 上测试时,它可以正常工作。所以可能有任何其他系统设置或其他因素触发“句柄无效”错误(服务包/修补程序......?)。

但我的同事报告说,在他停止使用远程桌面连接后,他再也没有看到错误。

关于c# - Graphics.CopyFromScreen() 和 GetDC(0) 失败,返回 "The handle is invalid",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31814215/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com