【问题标题】:getting window screenshot windows API获取窗口截图 windows API
【发布时间】:2010-03-15 12:52:45
【问题描述】:

我正在尝试制作一个在现有 GUI 之上运行的程序,以对其进行注释并提供额外的计算和统计信息。我想使用图像识别来做到这一点,因为我在大学里使用 Matlab 和类似的东西学到了很多这方面的知识。我可以获得要对其执行图像识别的窗口的句柄,但我不知道如何将该句柄转换为该窗口及其所有可见子窗口的图像。我想我正在寻找类似截图功能的东西,但仅限于单个窗口。

我该怎么做呢?我想我需要一个 .bmp 之类的东西来处理。此外,它必须足够高效,以至于我可以每秒调用几次而不会使我的 PC 停止运行。

希望这不是一个明显的问题,我在 google 中输入了一些内容,但没有得到任何相关信息。

【问题讨论】:

    标签: c++ winapi graphics screenshot


    【解决方案1】:

    我认为CImage 课程会有所帮助。

    void CreateImage(HWND hwnd)
    {
        CImage img;
        img.m_hDC = ::GetWindowDC(hwnd);
        img.Save(strFileName);
    }
    

    【讨论】:

      【解决方案2】:

      一种简单的方法是使用PrintWindow API(基本上是一个自动化的 Alt + Print)。以下示例截取了计算器的屏幕截图,但您只需更换手柄即可。

      void CScreenShotDlg::OnPaint()
      {
          // device context for painting
          CPaintDC dc(this);
      
          // Get the window handle of calculator application.
          HWND hWnd = ::FindWindow( 0, _T( "Calculator" ));
      
          // Take screenshot.
          PrintWindow( hWnd,
                       dc.GetSafeHdc(),
                       0 );
      }
      

      (见https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-printwindow

      【讨论】:

      • 在MSDN上找不到PrintWindow函数的描述
      • 请描述如何保存为位图对象以供重复使用
      • 不确定是否习惯这样说,但我已经用指向 msdn 的链接替换了死链接。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-09
      • 1970-01-01
      相关资源
      最近更新 更多