下面就是获取窗口句柄的基本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 (/*!IsWindowVisible(window) ||*/
(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;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
有了以上几个API,我们就可以获取所以窗口的句柄了, INCLUDE_MINIMIZED 表示包含最小化的程序
HWND pWnd;
pWnd = first_window(INCLUDE_MINIMIZED); //得到第一个窗口句柄
pWnd = next_window(pWnd,INCLUDE_MINIMIZED);//得到下一个窗口句柄
1
2
3
可通过 get_window_title 函数获取该窗口是否是你想要截取的。
下面就是截图了,如果 pWnd 为0,表明截取的是全屏幕的图:
QScreen *screen = QGuiApplication::primaryScreen();
QPixmap map = screen->grabWindow((WId)pWnd);
map.save(QString(OBS_SCREEN_PATH),"JPG");