java - 如何在 NSIS 中获取 Java Swing 应用程序的窗口句柄?

标签 java windows nsis

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

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

最佳答案

您可以使用 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 互斥体或其他命名内核对象并检查这些...

关于java - 如何在 NSIS 中获取 Java Swing 应用程序的窗口句柄?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8442406/

相关文章:

java - 从 NSIS 脚本向 java vm 传递参数

java - 将节点添加到 org.w3c.dom.NodeList

java - 如何添加到 BigDecimal

java - 为什么我每次调用 readObject 时 Java 的对象流都返回相同的对象?

c++ - c++ 中将 SID 转换为帐户用户名的最佳函数是哪个?

NSIS IfFileExists - 不止一行

unicode - NSIS 写入INIStr Unicode

java - Spring 社交 Facebook 更新过期 token

c - "Processes.GetProcessesByName("PROCESSNAME")"的 C 版本是什么?

windows %PATH% 变量 - 如何在 CMD shell 中再次拆分 ';'