2011-07-19 3 views
3

Delphiアプリケーションをチェックし、フォームのインスタンスは既にこの道を開いている場合:開かれたフォームインスタンスがデザイナーからのものかどうかを確認する方法は?

form := FindWindow(PAnsiChar(FormClassName), nil); 
    if form > 0 then 
    begin 
    SendMessage(form, WM_ACTIVATEAPP, 0, 0); 
    Result := True; 
    end else 
    Result := False 

問題は、フォームがDelphiのデザイナーウィンドウとして開いているとき、それは、フォームが開いていると言うことです。フォームを開いてメソッドをブレークポイントにすると、アプリケーションが動作しなくなったので、私はちょうど勤務時間を失った:-(

フォームクラスインスタンスが?デザイナー


回答:以下
opc0deの提案は良い解決策に私を加鉛ので、私は答えとしての彼のコメントを受け付けています、私はすべての開いているフォームを反復処理するためにコードを変更する必要がここに。世界のコピーアンドパターの幸福のためのコードの最終版です:

function VerifyFormIsOpen(formClass: String): Boolean; 
var 
    windowHndl, windowOld: HWND; 
    processId: Cardinal; 
begin 
    windowOld := 0; 
    windowHndl := 0; 
    Result := False; 
    repeat 
    windowHndl := Windows.FindWindowEx(0, windowOld, 
            PAnsiChar(formClass), nil); 
    if (windowHndl > 0) then 
    begin 
     Windows.GetWindowThreadProcessId(windowHndl, processId); 
     if processId = Windows.GetCurrentProcessId() then 
     begin 
     Windows.SendMessage(windowHndl, Messages.WM_ACTIVATEAPP, 0, 0); 
     Result := True; 
     break; 
     end; 
    end; 
    windowOld := windowHndl; 
    until windowHndl = 0; 
end; 
+0

これは現在のアプリケーションまたは別のアプリケーションのフォームですか?別の場合:あなたが本当に@ Cosmin Prundのようなあなたのアプリケーションのための "シングルトン"ソリューションを探しているのですか? – NGLN

+0

@NGLN:別のアプリケーションであるIDEです。 FindWindowは、システムで開いているすべてのウィンドウをチェックします。解決策は、フォームがチェック中のプロセスと同じであるかどうかをチェックします。 – neves

答えて

3

使用GetwindowthreadprocessidそのIDがそれを意味し、あなたのプロセスに等しい場合、ウィンドウのプロセスIDを取得するために私は例を投稿することはできません有効window.sorryですが、私は場合、私の携帯

+1

EnumProcesses()を使用して、ウィンドウプロセスIDが現在のプロセスではなくIDEインスタンスに属しているかどうかを確認します。そうすれば、コードは、アプリの他のインスタンスに属するウィンドウがあるかどうかを確認することができます。 –

+0

opc0deの提案は私を正しい解決に導いた。私は答えとして彼のコメントを受け入れている、私は質問に完全な解決策を入れます。 – neves

5

から書いていますアプリケーションのインスタンスが1つしか実行されないように、この作業を行っています。正しく行うには、ミューテックスを使用します。 Mutexを作成して使用する方法については、my answerthis questionを参照するか、Jediの実装に関するその質問に対する回答を参照してください。

あなたがMutexを作成することができたら、ウィンドウを探すことはできません。見つけたとしても、それはIDEか、まったく同じ名前の別のアプリケーションからです。

+0

これは良い解決策ですが、上記のコードは数十社の社内アプリケーションで使用されているライブラリクラスにあります。どこでもコードを変更することはできません。 – neves

関連する問題