我们知道QT里截图的代码很简单,很多例子都是截取桌面,或截取整个屏幕。
那如果要截取指定窗口的画面呢?即使该窗口不在桌面最顶层显示。我们也能截到它的图片吗?
当然可以,只要我们拿到该窗口的句柄就可以截图了。
下面就是获取窗口句柄的基本API。
获取Windows下所有窗口的句柄,窗口标题,窗口类型等:
#include <windows.h>
enum window_search_mode {
INCLUDE_MINIMIZED,
EXCLUDE_MINIMIZED
};
static bool check_window_valid(HWND window, enum window_search_mode mode)
{
DWORD styles, ex_styles;
RECT rect;
if (
(mode == EXCLUDE_MINIMIZED && IsIconic(window)))
return false;
GetClientRect(window, &rect);
styles = (DWORD)GetWindowLongPtr(window, GWL_STYLE);
ex_styles = (DWORD)GetWindowLongPtr(window, GWL_EXSTYLE);
if (ex_styles & WS_EX_TOOLWINDOW)
return false;
if (styles & WS_CHILD)
return false;
if (mode == EXCLUDE_MINIMIZED && (rect.bottom == 0 || rect.right == 0))
return false;
return true;
}
static inline HWND next_window(HWND window, enum window_search_mode mode)
{
while (true) {
window = GetNextWindow(window, GW_HWNDNEXT);
if (!window || check_window_valid(window, mode))
break;
}
return window;
}
static inline HWND first_window(enum window_search_mode mode)
{
HWND window = GetWindow(GetDesktopWindow(), GW_CHILD);
if (!check_window_valid(window, mode))
window = next_window(window, mode);
return window;
}
QString get_window_title(HWND hwnd)
{
QString retStr;
wchar_t *temp;
int len;
len = GetWindowTextLengthW(hwnd);
if (!len)
return retStr;
temp = (wchar_t *)malloc(sizeof(wchar_t) * (len+1));
if (GetWindowTextW(hwnd, temp, len+1))
{
retStr = QString::fromWCharArray(temp);
}
free(temp);
return retStr;
}
QString get_window_class(HWND hwnd)
{
QString retStr;
wchar_t temp[256];
temp[0] = 0;
if (GetClassNameW(hwnd, temp, sizeof(temp) / sizeof(wchar_t)))
{
retStr = QString::fromWCharArray(temp);
}
return retStr;
}
有了以上几个API,我们就可以获取所以窗口的句柄了, INCLUDE_MINIMIZED 表示包含最小化的程序
HWND pWnd;
pWnd = first_window(INCLUDE_MINIMIZED);
pWnd = next_window(pWnd,INCLUDE_MINIMIZED);
可通过 get_window_title 函数获取该窗口是否是你想要截取的。
下面就是截图了,如果 pWnd 为0,表明截取的是全屏幕的图:
QScreen *screen = QGuiApplication::primaryScreen();
QPixmap map = screen->grabWindow((WId)pWnd);
map.save(QString(OBS_SCREEN_PATH),"JPG");
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)