【问题标题】:How does one get the window handle of a Java Swing app in NSIS?如何在 NSIS 中获取 Java Swing 应用程序的窗口句柄?
【发布时间】:2023-03-26 11:20:02
【问题描述】:

我正在使用 NSIS 为基于 Swing 的 Java 应用程序创建更新安装程序。我需要知道应用程序是否已经在运行,如果是,则中止安装。我问过这个here,但它本质上归结为通过窗口标题来识别应用程序。

NSIS 有一个 FindWindow 函数,它将窗口句柄作为强制参数。 现在我的问题是:鉴于您没有 Spy++ 或 WinSpy++,并且被优秀的公司 IT 阻止下载其他工具,您如何找到 Swing 应用程序的窗口句柄? Java 应用程序有标准的窗口句柄名称吗?

【问题讨论】:

  • FindWindow 需要一个窗口类名和/或窗口标题,如果找到与该类/标题匹配的窗口,它会返回一个窗口句柄...

标签: java windows nsis


【解决方案1】:

您可以使用 NSIS 枚举窗口,系统插件自述文件有一个 EnumChildWindows example 非常接近枚举顶级窗口所需的代码。

!include LogicLib.nsh
showinstdetails show
section

System::Get "(i.r1) iss"
Pop $R0
System::Call "user32::EnumWindows(k R0,i) i.s"
loop:
    Pop $0
    StrCmp $0 "callback1" 0 done
    System::Call "user32::IsWindowVisible(ir1)i.r2"
    ${If} $2 <> 0
        System::Call "user32::GetWindowText(ir1,t.r2,i${NSIS_MAX_STRLEN})"
        System::Call "user32::GetClassName(ir1,t.r3,i${NSIS_MAX_STRLEN})"
        IntFmt $1 "0x%X" $1
        DetailPrint "$1 - [$3] $2"
    ${EndIf}
    Push 1 # callback's return value
    System::Call "$R0"
    Goto loop
done:
System::Free $R0

sectionend

如果您控制 Swing 应用程序代码,您可以使用其他方法来检查正在运行的实例,您可以创建 Win32 互斥锁或其他命名的内核对象并检查这些...

【讨论】:

  • 谢谢,这完全符合要求:)
猜你喜欢
  • 2010-11-19
  • 1970-01-01
  • 2023-01-26
  • 2022-10-12
  • 2020-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-15
相关资源
最近更新 更多