C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.101181 の関連記事表示

<< 0 >>
■101181  Re[3]: タスクトレイ常駐アプリにおいて多重起動を禁止しアクティブ化
□投稿者/ 魔界の仮面弁士 -(2023/01/16(Mon) 21:59:17)
    No101176 (KT さん) に返信
    > 多重起動の禁止まではできました。その後の既に起動しているフォームのアクティブ化ができず悩んでおります。
    フォームが非表示なだけで存在はしている状態なら、
    対象プロセスのフォームのハンドルに対して、API でアクティブ化してみるとか。
    https://dobon.net/vb/dotnet/process/appactivate.html


    No101178 (KT さん) に返信
    > これを多重起動を検知した際に呼び出せるような方法はないですかね。
    別プロセスのメソッドを呼び出したいという話なら、
    WCF もしくは .NET Remoting とか。


    あるいは、独自の Windowss Message を投げてみるとか。
    対象フォームを下記のように実装しておけば、あとから起動した方が
      SendMessage(hWnd, KT_MESSAGE_SHOWANDACTIVE, IntPtr.Zero, IntPtr.Zero);
    を投げることで、そのフォームがアクティブ化されます。


    private const int SW_RESTORE = 9;
    [DllImport("user32.dll")]
    private static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
    [DllImport("user32", CharSet = CharSet.Auto)]
    private static extern int RegisterWindowMessage(string lpString);
    private readonly int KT_MESSAGE_SHOWANDACTIVE;

    public Form1()
    {
      InitializeComponent();
      KT_MESSAGE_SHOWANDACTIVE = RegisterWindowMessage("KT_MESSAGE_SHOWANDACTIVE");
    }

    protected override void WndProc(ref Message m)
    {
      base.WndProc(ref m);
      if (m.Msg == KT_MESSAGE_SHOWANDACTIVE)
      {
        ShowAndActive();
      }
    }

    private void ShowAndActive()
    {
      this.Visible = true;
      if(this.WindowState == FormWindowState.Minimized)
      {
        // this.WindowState = FormWindowState.Normal;
        ShowWindowAsync(this.Handle, SW_RESTORE); // 直前の状態は最大化だったかもしれない
      }
      this.Activate();
    }
記事No.101173 のレス /過去ログ176より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -