既に起動されているプログラムを前面に表示でききません。

解決


はじめての質問者  2006-03-08 18:22:36  No: 20433  IP: 192.*.*.*

初歩的は質問ですが...
重複チェックはうまく行くのですが、
起動プログラムが前面に表示されませんがなぜでしょう??

conExeName = 'MainMenu'

var
  Atm               : TAtom;        {アトム値}
  hApp              : THandle;      {アプリケーションのハンドル}
begin
  {GlobalFindAtomでアプリケーション名が登録済みか調べる}
  Atm := GlobalFindAtom(PChar(ExtractFileName(Application.ExeName)));
  {戻り値が0以外ならすでに登録されている=起動されている}
  If  0   <>    Atm   Then  Begin
    {自分と同じタイトルのアプリケーションを探す}
    hApp  := FindWindow(nil, conExeName);
    If  0   <>  hApp  Then  Begin
      {既に起動されている場合は前面に表示するのみ}
      SendMessage(hApp, WM_SYSCOMMAND, SC_RESTORE, 0);
      SetForeGroundWindow(hApp);
      ShowMessage('重複起動はできません!!');
      Exit;
    End;
  End Else  Begin
    {起動されていない場合はアトム値を登録する}
    {GlobalAddAtomで新規のアトム値を登録する}
    Atm := GlobalAddAtom(PChar(ExtractFileNAme(Application.ExeName)));
    {Atm が0ならアトム値が登録できなかったのでエラーにする}
    If  0   =   Atm   Then  Begin
      ShowMessage('起動できません!!');
      Exit;
    End;
  End;
  Application.Initialize;
  Application.CreateForm(TFMenu, FMenu);
  Application.Run;
  GlobalDeleteAtom(Atm);    {アプリケーションが終了したらアトム値を削除する}

編集 削除
アシタカ  2006-03-08 20:32:08  No: 20434  IP: 192.*.*.*

http://leed.issp.u-tokyo.ac.jp/~takeuchi/delphi/article/062/062449.html

編集 削除
はじめての質問者  2006-03-09 10:51:31  No: 20435  IP: 192.*.*.*

別タイトルのアプリケーションならアクティブになってくれました。
がっ、同じタイトルではだめでした....

編集 削除
ここそこ  2006-03-09 12:48:53  No: 20436  IP: 192.*.*.*

>ShowMessage('重複起動はできません!!');
この位置変えてみたら?
>SendMessage(hApp, WM_SYSCOMMAND, SC_RESTORE, 0);
このhAppの値もマズイんじゃない?

編集 削除
はじめての質問者  2006-03-10 09:39:18  No: 20437  IP: 192.*.*.*

>アシタカさん、ここそこサン
ありがとうございました。

編集 削除