检查,如果当前程序已运行就激活当前程序 简单的代码为什么没有效果,该如何处理
检查,如果当前程序已运行就激活当前程序 简单的代码为什么没有效果 - 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的问题.本人新手,谢谢
------解决方案--------------------
一个程序,用了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也可以实现类似功能.
------解决方案--------------------