【问题标题】:Comparing window titles that share a common structure but are not exactly the same in Windows OS比较具有相同结构但在 Windows 操作系统中不完全相同的窗口标题
【发布时间】:2013-03-17 19:32:22
【问题描述】:

我目前正在使用 Java 开发一个处理中断的项目。我的目标是了解何时是打断用户的好时机。目前,我当前的方法是列出不应中断的窗口,并将其与每 3 秒聚焦的窗口进行比较,然后使用键盘挂钩来检测它们是否正在打字。

但是,我遇到了 Microsoft Word 和许多其他程序没有固定窗口标题的问题。如果用户想要将 Microsoft Word 添加到不中断列表中,那么它只会添加当前正在处理的文件名,而不是可以用来唯一标识 Microsoft Windows 的文件名。另一个例子是twitter,如果用户将twitter添加到列表中,那么它不会认为(15) twitter是等价的。

是否有任何替代方法可用于检测窗口标题属于哪个程序或可能适合此问题的字符串搜索方法?

我也对如何做到这一点的全新方法持开放态度。

【问题讨论】:

  • 不会像stringThatContainsWindowName.indexOf(stringfromDontInterruptList)>0 这样的工作吗?
  • 此测试是否在测试 stringFromDontInterruptList 是否在第二个字符串 stringThatContainsWindowName 中?问题在于,如果在twitter 之前添加(15) twitter,那么如果测试(15) twittertwitter 中,它将返回false。这就是它的工作原理吗?
  • indexOf 返回它在调用它的字符串 (stringThatContainsWindowName) 内传递的字符串(在本例中为 stringFromDontInterruptList)的从零开始的位置,如果未找到,则返回 -1。在您的示例中,它将返回类似 5 的内容,因此最后进行比较。因此,简而言之,如果 stringFromDontInterruptList 在 stringThatContainsWindowName 内,它将返回一个 0 或更大的数字。请记住,这将区分大小写,因此您可能希望对两个字符串都执行 toLowerCase 或类似的操作。
  • stringThatContainsWindowName.contains(stringFromDontInterruptList) 是一个布尔值,它替换了indexOf 表达式,让你在做什么更清楚。另一个建议是围绕名称中的关键短语构建正则表达式并应用它。根据@MattSieker 关于大小写的注释,您可以以不区分大小写的方式应用正则表达式。

标签: java string windows-7 jna


【解决方案1】:

我认为比使用窗口标题更好的答案是获取实际的进程 ID 并将其保存在不被中断的进程列表中。这样你就不用担心改名了。

类似这里所做的事情应该可以解决问题:http://www.golesny.de/p/code/javagetpid

获得不太理想的 PID 的另一种方法:

如果您不知道该示例...获取 PID 的另一个选项如下:

String line = "";
Process p = Runtime.getRuntime().exec(System.getenv("windir") +"\\system32\\"+"tasklist.exe -v");
BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
while ((line = input.readLine()) != null) {
        System.out.println(line); // this should print out process names with PID

}

【讨论】:

  • 我创建了没有问题的类,现在我正在尝试测试代码,但我在理解此处引用的过程时遇到了一些问题:if (process.getClass().getName().equals("java.lang.Win32Process") || process.getClass().getName().equals("java.lang.ProcessImpl")) { 和此处的 p:@ 987654325@ 我认为它类似于HANDLE process = Kernel32.INSTANCE.GetCurrentProcess(); 我添加了一个 print 它将打印出 pid 但它不打印任何东西。你能解释一下我可能做错了什么吗?
  • 添加了一种不同的方式来获取 pid 的答案,但您可能应该使用 JNA。
  • 感谢您的回答,非常感谢您的努力。我将使用我遇到的新问题创建一个new question,但您提供的示例是比较程序的一种更简洁的方法。
  • 我设法让它工作,但是每次程序终止并再次加载时,PID都会改变。程序或窗口没有静态标识符吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多