本文主要参考:Linux-Windows获取系统当前应用的窗口状态
填的转载
1、使用X11
Linux下窗口状态检可以通过X11的库来进行获取
不管是单文件编译还是项目文件编译都要有X11的动态库LIBS += -lX11
#include <X11/Xlib.h>
bool IsCurreenWindowFullScreen()
{
//首先创建一个窗口显示连接
Display *display = XOpenDisplay(NULL);
//获得当前的焦点窗口
Window focus;
int revert;
XGetInputFocus(display, &focus, &revert);
//获得窗口的属性
XWindowAttributes attr;
XGetWindowAttributes(display, focus, &attr);
//获得屏幕的尺寸
int screen_width = attr.screen->width;
int screen_height = attr.screen->height;
//关闭显示连接
XCloseDisplay(display);
//尺寸判断
if((attr.height == screen_height)&&(attr.width == screen_width))
{
return true;
}
else
{
return false;
}
}
采用X11的的库接口来获取当前窗口的属性是有缺陷的,部分应用的窗口尺寸获取不到。
比如浏览器的子窗口。
2、使用linux命令获取活动窗口大小与屏幕大小比较
using namespace std;
//剔除前后的空格和换行
void Trim(string & str)
{
string blanks("\f\v\r\t\n ");
str.erase(0,str.find_first_not_of(blanks));
str.erase(str.find_last_not_of(blanks) + 1);
}
//执行命令行的命令
string exec_command_line(string input_cmd_line)
{
FILE* pipe = popen(input_cmd_line.c_str(),"r");
if (!pipe)
return string("ERROR");
char buffer[256];
string result ="";
while(!feof(pipe))
{
if(fgets(buffer, 256, pipe) != NULL)
result += buffer;
}
pclose(pipe);
return result;
}
//判断当前窗口是否全屏
void IsCurreenWindowFullScreen()
{
//获取窗口的ID
string active_win_cmd = string("xprop -root | grep _NET_ACTIVE_WINDOW | head -1 | \
awk '{print $5}' | sed 's/,//' | sed 's/^0x/0x0/'");
string active_win_id = exec_command_line(active_win_cmd);
Trim(active_win_id);
//异常ID过滤
if(active_win_id == string("0x00"))
{
return;
}
//获取屏幕尺寸
string screen_geo_info_cmd = string("xwininfo -root | awk -F'[ +]' '$3 ~ /-geometry/ {print $4}'");
string screen_info = exec_command_line(screen_geo_info_cmd);
Trim(screen_info);
//根据窗口ID获取窗口信息
string search_window_cmd = string("xwininfo -id ") + active_win_id
+ string(" | awk -F'[ +]' '$3 ~ /-geometry/ {print $4}'");
string active_window_info = exec_command_line(search_window_cmd);
Trim(active_window_info);
//窗口状态判断
if(active_window_info == screen_info)
{
//do something when full screen
}
else
{
//do something when not full screen
}
}
在多屏幕下其它常用的命令:
```cpp
#获得屏幕的个数
xrandr | grep ' connected ' | wc -l
#多屏幕状态下获取屏幕尺寸
xwininfo -root | awk -F'[ +x]' '$3 ~ /-geometry/ {printf "%dx%d",$4/'"$(xrandr | grep ' connected ' | wc -l)"',$5}'