我正在尝试在X11会话中获取所有顶级桌面窗口的列表.基本上,我想获得窗口管理器应用程序切换UI中显示的所有窗口的列表(通常在用户按下ALT + TAB时打开).
我之前从未做过任何X11编程,但到目前为止,我已经设法通过整个窗口列表进行枚举,代码看起来像这样:
void CSoftwareInfoLinux::enumerateWindows(Display *display, Window rootWindow)
{
Window parent;
Window *children;
Window *child;
quint32 nNumChildren;
XTextProperty wmName;
XTextProperty wmCommand;
int status = XGetWMName(display, rootWindow, &wmName);
if (status && wmName.value && wmName.nitems)
{
int i;
char **list;
status = XmbTextPropertyToTextList(display, &wmName, &list, &i);
if (status >= Success && i && *list)
{
qDebug() << "Found window with name:" << (char*) *list;
}
status = XGetCommand(display, rootWindow, &list, &i);
if (status >= Success && i && *list)
{
qDebug() …Run Code Online (Sandbox Code Playgroud) 我在Mac上有一个纯C++/Qt项目,但我现在发现我需要调用一些只在Cocoa API中可用的方法.按照此处列出的说明:
http://el-tramo.be/blog/mixing-cocoa-and-qt
我在".m"文件中有一个C++类实现.作为测试,我的"foo.m"文件包含以下代码(#include为清晰起见,已删除相关方法):
int foo::getMagicNumber()
{
NSCursor *cursor = [NSCursor new];
}
Run Code Online (Sandbox Code Playgroud)
显然,我需要将.m文件添加到名为的qmake变量中OBJECTIVE_SOURCES.我的项目.pro文件如下所示:
TARGET = testApp
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
SOURCES += main.cpp
OBJECTIVE_SOURCES += foo.m
HEADERS += test.h
Run Code Online (Sandbox Code Playgroud)
但是,每当我尝试编译项目时,都会收到以下错误:
foo.h:4expected '=', ',', ';', 'asm' or '__attribute__' before 'foo'
这是指向class foo我的头文件中的文件.如果我从.m文件中删除所有cocoa调用,并将.m文件移动到SOURCES我的Qt .pro文件的部分,一切都按预期工作.
我正在使用Qt 4.6.0.
我的问题是:将Cocoa调用与Qt/C++集成的推荐方法是什么,以及我在上面的例子中做错了什么?
我想使用Accessibility API获取给定应用程序(外部)的所有窗口的列表.
目标是检查某个窗口是否打开.首先,我检查应用程序是否正在运行(使用[NSWorkspace runningApplications]并检查每个应用程序),然后我想检查为该应用程序打开的每个窗口的标题栏文本.
PS
所以我可以使用PID为app创建一个元素:
AXUIElementRef app = AXUIElementCreateApplication(pid);
Run Code Online (Sandbox Code Playgroud)
但我该怎么办呢?我是否朝着正确的方向前进?不能相信它很难找到这方面的例子.
我是Cocoa的新手,我想知道如何获得所有打开窗口的列表.我不是在谈论运行程序,因为这将是一件容易的事.我想列出窗口,例如,如果我打开10 pdf打开预览,我的程序应该能够检索包含所有这些pdf的列表.我还想知道是否有一些API可用于与已经打开的窗口进行交互(并且可能移动它们或做其他事情)来自外部应用程序.谢谢.