簡體   English   中英

特定窗口 C++ 的屏幕截圖

[英]Screen capture of specific window c++

我想截取某個特定窗口(例如計算器)的屏幕截圖。

這是我根據這個討論編寫的代碼:

// Get the window handle of calculator application.
HWND hWnd = ::FindWindow(0, _T("Calculator"));
RECT r;
GetWindowRect(hWnd, &r);
int x[2]; int y[2];
x[0] = r.top;  x[1] = r.bottom;
y[0] = r.left; y[1] = r.right;

HDC     hScreen = GetWindowDC(hWnd);
HDC     hDC = CreateCompatibleDC(hScreen);
HBITMAP hBitmap = CreateCompatibleBitmap(hScreen, y[1] - y[0], x[1] - x[0]);
HGDIOBJ old_obj = SelectObject(hDC, hBitmap);
BitBlt(hDC, 0, 0, y[1] - y[0], x[1] - x[0], hScreen, y[0], x[0], SRCCOPY);

之后,我將位圖保存為 .bmp 圖像。

結果具有計算器窗口的正確大小和位置,但生成的 bmp 全黑。

我嘗試對整個桌面進行截圖,然后剪切計算器部分,結果奏效了。 但我希望能夠制作窗口的屏幕截圖,即使它被最小化或被另一個窗口覆蓋。

任何想法為什么此代碼不起作用或有其他方法可以做到嗎?

謝謝。

一種可供考慮的方法是CreateForWindow

考慮到目標窗口是可移動的,另一個角度是將其重新定位到當前桌面的左上角。 執行整個屏幕的捕獲,然后,假設您知道窗口的尺寸,將其裁剪為這些尺寸。
如果安全程序可以被暫停或終止,目標窗口沒有隱藏,或者以上述評論中討論的方式合成,或者當 Aero 可以暫時禁用時,這有更好的成功機會。

最簡單的方法是使用PrintWindow

下面是一些例子:

  • 如果你想繪制整個窗口(帶框架),只需這樣做: PrintWindow(calculatorHwnd, destHwnd, 0);
  • 如果您只想捕獲窗口的客戶區,可以使用以下方法: PrintWindow(calculatorHwnd, destHwnd, PW_CLIENTONLY);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM