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

わんくま同盟

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

C# と VB.NET の入門サイト


(過去ログ 176 を表示中)
■101181 / )  Re[3]: タスクトレイ常駐アプリにおいて多重起動を禁止しアクティブ化
□投稿者/ 魔界の仮面弁士 (3540回)-(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();
}
返信 編集キー/


管理者用

- Child Tree -