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

时间:2011-12-09 07:35:32

标签: java windows nsis

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

NSIS有一个FindWindow函数,它将窗口句柄作为必需参数。 现在我的问题是:你如何找到Swing应用程序的窗口句柄,假设你没有Spy ++或WinSpy ++,并且被精彩的企业IT阻止下载其他工具? Java应用程序是否具有标准窗口句柄名称?

1 个答案:

答案 0 :(得分: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互斥锁或其他命名的内核对象并检查这些...