检查,如果当前程序已运行就激活当前程序 简单的代码为什么没有效果,该如何处理

检查,如果当前程序已运行就激活当前程序 简单的代码为什么没有效果 - C++ Builder / Windows SDK/API
一个程序,用了TrayIcon控件,运行后最小化至系统托盘.现在想实现:

如果用户再点该程序企图运行,则程序会检查当前是否已经运行,如果没有运行就运行,如果运行了就激活,我的代码如下:


try
{
  Application->Initialize();
  HANDLE hnd = CreatMutex(NULL,TRUE,"MyApp");
  if(NULL == hnd)
  {
  MessageBox(NULL,"fail","fail",MB_OK|MB_SYSTEMMODAL);
  return 0;
  }
  if(GetLastError()==ERROR_ALREADY_EXISTS)
  {
  ReleaseMutex(hnd);
  HANDLE handle = OpenMutex(MUTEX_ALL_ACCESS,TRUE,"MyApp");
  if(NULL!=handle)
  {
  SetForegroundWindow(handle); //这个试了没效果
      SendMessage(handle,SW_SHOWMINNOACTIVE,0,0); //这个试了也没用
  ReleaseMutex(handle);
  }
  return 0;
  }
  //后面就不写了,
  Application->CreateForm(_.............);
  Application->CreateForm(_.............);
  Application->Run

catch...
...
...

请达人们看下我的代码,应该如何实现,是不是用了trayIcon的问题.本人新手,谢谢




------解决方案--------------------
C/C++ code

HWND  hdc  =  FindWindow("TForm1","Form1");  
if  (NULL  !=  hdc)  
{  
  ::MessageBox(NULL,"已经运行了一个实例!",Application->Title.c_str(),MB_OK|MB_SYSTEMMODAL);  
   //...
}

------解决方案--------------------
HANDLE handle = OpenMutex(MUTEX_ALL_ACCESS,TRUE,"MyApp"); 
估计是获得应用程序的句柄,而不是其主窗口句柄吧,因为BCB编的应用程序其实是一个看不见的窗口,换成用FindWindow试试吧
------解决方案--------------------
简单的FindWindow是不行的,因为后面开启的进程主窗体的标题肯定和前一个相同,所以有可能找到的不是第一个进程,而是第二个进程,要么将控制代码放入Project代码中,或使用ServerSocket也可以实现类似功能.
------解决方案--------------------
探讨
简单的FindWindow是不行的,因为后面开启的进程主窗体的标题肯定和前一个相同,所以有可能找到的不是第一个进程,而是第二个进程,要么将控制代码放入Project代码中,或使用ServerSocket也可以实现类似功能.