2011-12-09 16 views
0

私はNSISを使ってSwingベースのJavaアプリケーション用のアップデートインストーラを作成しています。私は、アプリケーションがすでに実行中であるかどうかを知り、インストールされている場合はインストールを中止する必要があります。私はこのhereに尋ねましたが、基本的にはウィンドウタイトルでアプリケーションを特定することに沸きます。NSISでJava Swingアプリケーションのウィンドウハンドルを取得するにはどうすればよいですか?

NSISには、ウィンドウハンドルを強制パラメータとして使用するFindWindow関数があります。 私の質問のために:Spy ++やWinSpy ++を持たず、すばらしい企業のIT部門が追加のツールをダウンロードできないことを考えれば、Swingアプリケーションのウィンドウハンドルをどうやって見つけることができますか? Javaアプリケーションには標準のウィンドウハンドル名がありますか?

+0

のFindWindowが必要です...それらをチェックウィンドウのクラス名やウィンドウのタイトル、それはクラス/タイトルに一致するウィンドウが見つかった場合、ウィンドウハンドルを返します... – Anders

答えて

1

NSISを使用してウィンドウを列挙することができます。システムプラグインのreadmeには、最上位ウィンドウを列挙するために必要なコードに非常に近いEnumChildWindows exampleがあります。あなたが実行中のインスタンスを確認するために他の方法を使用することができますSwingのアプリのコードをコントロールしている場合

!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 

、あなたは、Win32ミューテックスまたは他の名前付きカーネルオブジェクトを作成することができますし、

+0

ありがとう、これは完全に法案に適合:) – Rex

関連する問題