- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
目前,我正在努力在 MS Windows 中获取前景(顶部)窗口/进程。我需要使用 JNA 在 macOS 中做类似的事情。
macOS 中的等效代码是什么?
byte[] windowText = new byte[512];
PointerType hwnd = User32.INSTANCE.GetForegroundWindow();
User32.INSTANCE.GetWindowTextA(hwnd, windowText, 512);
System.out.println(Native.toString(windowText));
最佳答案
这里其实有两个问题,前台窗口和前台进程。我会尽量回答这两个问题。
对于前台进程,使用 JNA 的一种简单方法是映射 Application Services应用程序接口(interface)。请注意,这些函数是在 10.9 中引入的,现在已弃用,但从 10.15 开始仍然有效。较新的版本在 AppKit
中图书馆,见下文。
创建这个类,映射你需要的两个函数:
public interface ApplicationServices extends Library {
ApplicationServices INSTANCE = Native.load("ApplicationServices", ApplicationServices.class);
int GetFrontProcess(LongByReference processSerialNumber);
int GetProcessPID(LongByReference processSerialNumber, IntByReference pid);
}
“前台”进程可以通过
GetFrontProcess()
获得.这会返回一个叫做
ProcessSerialNumber
的东西,整个应用程序服务 API 中使用的唯一 64 位值。要将其转换为您的用户空间使用,您可能需要进程 ID 和
GetProcessPID()
为你做那个翻译。
LongByReference psn = new LongByReference();
IntByReference pid = new IntByReference();
ApplicationServices.INSTANCE.GetFrontProcess(psn);
ApplicationServices.INSTANCE.GetProcessPID(psn, pid);
System.out.println("Front process pid: " + pid.getValue());
AppKit
图书馆:
public interface AppKit extends Library {
AppKit INSTANCE = Native.load("AppKit", AppKit.class);
}
关于使用此库的最顶层应用程序,还有多个其他 StackOverflow 问题,例如
this one .映射所需的所有导入和对象比我在这里的答案中做的工作要多得多,但您可能会发现它很有用。弄清楚如何使用
Rococoa framework 可能更容易。 (它在底层使用 JNA,但已经通过 JNAerator 映射了所有 AppKit)来访问这个 API。一些
javadocs are here .
AppleScript
您可以使用
Runtime.exec()
通过命令行从 Java 执行并捕获输出。
CoreGraphics
获取所有窗口的列表通过 JNA,包括
CFDictionary
包含更多信息。
kCGWindowLayer
这将返回
CFNumber
代表窗口层数。文档说明这是 32 位的,所以
intValue()
是合适的。该数字是“绘图顺序”,因此较高的数字将覆盖较低的数字。因此,您可以遍历所有检索到的窗口并找到最大数量。这将是“前景”层。
kCGWindowBounds
键返回 CGRect
(具有 4 个 double 、X、Y、宽度、高度的结构)。kCGWindowIsOnscreen
键来确定窗口是否可见。它返回一个
CFBoolean
.由于该 key 是可选的,因此您需要测试
null
.但是,如果您从无到有,最好使用
kCGWindowListOptionOnScreenOnly
Window Option Constant当您最初拨打
CGWindowListCopyWindowInfo()
时.
CGWindowListCopyWindowInfo()
函数需要一个
CGWindowID
参数
relativeToWindow
你可以添加(按位或)
kCGWindowListOptionOnScreenAboveWindow
到选项。
CGWindowListCreate()
使用与
CopyInfo()
类似的语法变体。它返回一个窗口编号数组,您可以将字典搜索限制到该数组,或者将该数组作为参数传递给
CGWindowListCreateDescriptionFromArray()
.
Create
创建的每个对象。或
Copy
函数,并负责在完成后释放它们,以避免内存泄漏。
关于java - 如何在 MacOS 上使用 Java(使用 JNA)获取前景窗口/进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63469738/
我的应用程序可以正确接收通知,但无法显示包含收到的信息的弹出通知(如果应用程序已打开)。 注意:如果应用程序在后台,通知会毫无问题地显示。 我的代码: 我以这种方式收到通知: @Override pu
我需要根据收到远程推送通知的时间来处理它们。当应用程序在后台或终止时,如果我收到推送通知,当我点击推送通知时,我会在 ` 中处理它 - (void)application:(UIApplication
我想根据控件的状态更改/动画自定义按钮控件模板的 Foreground 属性。 在 RC0 之前,我设置了 ContentPresenter 的前景,给它一个 x:Name,并在 VisualStat
我正在尝试设置 block ,以便其前景色每次都会改变鼠标光标移到它上面,这是我的代码: Remove Message
Closed. This question needs to be more focused。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅关注editing this post一个问题。 6
有时,当我执行“docker-compose up -d”时,我忘记了“-d”部分。因此它开始向我显示启动日志,如果我按Ctrl + C,它将终止所有过程并向我显示关闭日志。 我对此有几个问题: 如果
我有一个启动器风格的应用程序。用户启动应用程序后,时钟开始滴答作响,经过一定时间后,用户将返回到我的应用程序的主要 Activity,并被告知时间到了。 为了实现这一点,我有一个 AsyncTask,
我有一个 FrameLayout,我想通过选择器为它应用前景可绘制对象,我正在尝试实现“drawSelectorOnTop”但是为了简单的布局 现在当用户按下“state_pressed”时选择器不适
我很难改变 Angular 2 Material 的前景颜色。例如在工具栏中,文本是黑色的。我尝试用以下样式更改它 @import '~@angular/material/theming'; $pri
我有一个奇怪的案例。我的 swift ios 应用程序已连接到 Cloudkit。如果应用程序未运行(后台状态),我每次都会收到我的通知徽章和警报!如果应用程序正在运行,则不会收到任何通知!我知道它没
这个问题在这里已经有了答案: How to change Status Bar text color in iOS (59 个答案) How to change the status bar bac
我想知道是否可以更改共享元素过渡的 z 顺序?看: 我有一个带有图像的布局,它填满了整个屏幕。图片前面是一个显示图片标题的文本框。如果我点击文本框,将开始过渡到详细信息 Activity 。因此,我实
每当文本框获得焦点时,文本的边框和前景都会根据当前主题更改: 主题灯->边框:黑色,文字:白色,背景:透明 theme dark ->border:white, text:white, backgro
我最近开始熟悉 Web 应用程序开发并努力解决一个基本的 css 布局问题。 所需的布局是一个中心区域重叠几个背景元素。看这里: 此图像显示了所需的布局: 我也在 codepen 上破解过它: Cod
这是交易。我可以创建一个 ListBox 并为其设置样式。我可以编辑模板的副本,以便状态在 Expression Blend 3 中可用。我可以更改状态,以便在选择时修改行项目的背景颜色。但是由于 C
我可以通过这样做来改变 QImage 的背景: QPainter painter(&image); painter.setCompositionMode(QPainter::CompositionMo
我有一个为 iOS8 实现的共享扩展。该服务使用 OAuth 进行身份验证。我用于扩展的登录信息与容器应用共享。 问题是: 当我在扩展中时,然后应用程序切换到容器应用程序并注销,然后应用程序切换回包含
我有一个 WPF Canvas 项目,我从工具箱中将对象拖放到 Canvas 上。根据某些数据,其中一些对象应该闪烁或闪烁。我得到一个未处理的异常:无法在不可变对象(immutable对象)实例上设置
我是一名优秀的程序员,十分优秀!