<Windouws 98, Delphi 6>の環境です。shellExecute のことが何度も話題になっていますが、私には次の点がまだ分かりません。
自作のエディターで、単語をクリックしてクリップボードにコピー、ShellExecuteで呼び出された辞書検索アプリがそれを取得して辞書を引き、検索結果を自分のTrichEditに示す、ということをやっているのですが、次が分かりません。
どうやったら、エディターでのクリックが行われるたびに、すでに開いている辞書検索アプリをアクティヴェイトできるのでしょうか。今の私のエディターでは、ShellExecuteファンクションの戻り値が32以上ならば辞書アプリ'open'に成功、という感知しかできません。どなたか御教示いただけませんでしょうか。
辞書アプリ側の実装に依ります。
たとえば、1つのインスタンスしか許さないアプリケーションを僕が作る場合、ShellExecuteなどで起動したら、自分自身(2)がすでに起動しているかどうかを探し、見つかったら自分自身(1)は終了し、すでにある自分自身(2)をActivateにします。
このような実装をした場合、ShellExecuteで立ち上げた側は、成功したが、起動したEXEはすぐに終了した、と見なします。
ShellExecuteExを使えば、起動したアプリケーションのインスタンスを得ることができます。
これで確認してみてはどうですか?
たぶん、ShellExecuteExで得たインスタンスは、複数起動を許さないアプリの場合はすぐに破棄されていると思います。
他の方法ですが、FindWindowなどで、対象のウィンドウを検索し、見つかったらそれをActivateし、見つからなかったらShellExecuteすれば、うまく行くと思います。
アドバイスをいただきありがとうございました。
WinAPIのFindWindowほうがやさしいかもしれないと思い勉強し始めました。
procedure TForm1.CopyToClipBoardClick(Sender: TObject);
var HWND:integer;
begin
---
---
if not Dictionary_opened then //flag, boolean
begin
if ShellExecute( 0, 'open', PChar( DictionaryExe_Fullpath ), nil, nil, SW_SHOWNA ) >32 then
Dictionary_opened:=True
else
Dictionary_opened;
end
else
begin
HWND:=FindWindow( nil,PChar(DictionaryExe_Fullpath ) );
ShowWindow( HWND,SW_HIDE ); //????
end;
エディタアプリで単語を再びクリックすると、FindWindowの戻り値は0でした。
Dictionaryアプリがactiveか否かがこれで分かるのでしょうか?active でないことが分かった場合、すでに開かれている辞書アプリをどのようにすれば、activate できるのでしょうか?考えあぐねているうちに ShowWindowが目にとまりましたので、チャレンジ!でもハテナ?でした。
済みませんが、引き続きご指導をいただけないでしょうか。
FindWindowの使い方が間違っています。
FindWindowの構文は、
FindWindow(クラス名, ウィンドウ名)
です。
このクラス名は、Delphiのクラス名ではありません。ウィンドウ名も、EXEのパスとは違います。
付属のWinSight32で、ウィンドウ名などは確認できます。
# これ、使いづらいです
こないだ見つけたツールで、Nuke++というものがありました。これも同じように、ウィンドウを列挙するアプリケーションです。
# Vectorで検索すると出てくると思います。
こういうツールを使って、対象となるウィンドウの名前を見つけてください。
ただし、TForm1などの単純な名前だと、他に同じような名前がある場合があります。
こういう場合は、EnumWindowsで、ウィンドウの列挙をして、GetWindowTextの値が対象アプリケーションのキャプションと同じものをとってくれば上手くいくはずです。
やっとできました。にしのさま、どうもありがとうございました。
ツイート | ![]() |