![]() |
1
2
如果你使用JDK16+,使用纯Java代码很容易读取当前前台窗口的PID,利用 Foreign Function Memory API 。最好从JDK22开始使用,因为FFM在发布之前正在孵化或预览。您需要调用以下Windows API方法:
此演示只是循环,因此您可以在运行时选择不同的窗口进行测试,并根据需要进行重构:
上面的代码非常简单。但有一个不平凡的问题——
为了简化,这里有一个版本,它提供了与jextract相同的功能,可以处理这些原生Windows方法的解析:
|
![]() |
2
1
在DuncG发布他的答案之前不久,我写了这篇文章。我意识到这与他的回答有很大重叠。(有趣的是,我们对使用哪些Windows本机函数的想法非常相似。)无论如何,我决定发布这篇文章,作为一种更紧凑的替代方案,不需要任何提取或代码生成。 像他一样,我建议使用本地语言 GetForegroundWindow , GetWindowThreadProcessId ,以及 GetWindowTextW Windows的功能:
|
![]() |
3
-1
你不能从java本身做到这一点。你需要更多的库。 Java是一种多平台语言,就像许多其他语言一样。所有这些语言都需要做出选择:操作系统提供的各种功能并不是通用的;毕竟,操作系统并不完全相同。它们以特定的方式做某些事情,其他操作系统根本不做,并以完全不同的方式满足底层用户的需求。那么,对于这种非(近乎)普遍的特征,语言应该做什么呢? Java选择根本不让这些内容可访问。这些功能本质上是不可测试的,除非有一台运行该操作系统的机器——这只是提供它的问题之一。其他语言选择不同的路线;例如,python非常愿意提供高度特定于操作系统的库。 解决方案-JNI
JNI或“Java本机接口”允许您为某些本机平台部署编译后的工件,并从Java代码中与它们进行交互。稍微简化一点,“从java调用C代码”(如果你的操作系统是基于C的……windows或多或少是)。因此,您需要一个用非java编写的库来做您想做的事情,然后您可以从java代码中调用它。这不是“java启动另一个应用程序并与之对话”(java也可以这样做,通过
所以,这是可能的,但并不容易;JNI相当笨拙。你还需要一个用C编写的东西来实现你的所有调用。你可以自己编写,但这意味着你需要有效地用C++编写并将其编译成DLL,从你的问题中,我感觉你不能这样做或不想这样做。 所以,你必须寻找为你完成这项工作的项目。 你有点幸运;JNA+JNA平台随心所欲:以下是 JNA's Platform Library 这可以做到这一点。
但是,它的使用很复杂,JNA并没有被广泛使用或积极开发。这是一个11岁的随机片段,它提供了
正如评论所说,java不是用于高度特定于操作系统的交互的好工具。但是,如果你坚持用旧鞋的背面砸碎这个特殊的螺丝,而不是使用正确的工具箱工具,你的答案就在那里。当然,现在你需要知道如何使用JNA,它有自己显著的学习曲线。 |
![]() |
Community wiki · 需要改变的用户界面模式? 1 年前 |
![]() |
LITzman · 使用状态处理颜色主题更改 1 年前 |
![]() |
Community wiki · 进程。退出(0):输出消失? 2 年前 |
![]() |
arsaces · 将文本添加到特定文件的末尾 2 年前 |
![]() |
YGranja · 库<图形。h> MinGW-W64缺少 2 年前 |
![]() |
Felipe Palermo · Ctrl键仍被按下,按键事件() 3 年前 |
![]() |
HCJ · win cmd中的批处理脚本循环 3 年前 |