难得碰到的问题,请高手帮我解决

_zzzzz 2002-08-17 12:56:29
当已运行的实例在后台或最小化时,如果再想运行第二个实例,则将第一个实例提到前台,并且不运行第二个实例,我在 winmain 的开始部分加了如下指令:


HANDLE hInstanceMutex = ::CreateMutex(NULL,FALSE, "Form1");

if(GetLastError() == ERROR_ALREADY_EXISTS)
{
if(hInstanceMutex)
CloseHandle(hInstanceMutex);

//Application->Title = "test";

HWND AppWnd=FindWindow(NULL,"test");
if(AppWnd)
{
if(IsIconic(AppWnd) || !IsWindowVisible(AppWnd))
ShowWindow(AppWnd,SW_RESTORE);
SetForegroundWindow(AppWnd);
}
return 0;
}

============================================================
在运行程序时遇到了一点麻烦,如果第一个实例没有被最小化,则一切正常。
但是如果第一个实例已被最小化,再运行第二次时,也可以把第一个实例提到前台来,
可是最小化的功能却不能实现了—— 不管怎么样按最小化按钮,窗口都不能再被最小
化了。??????????????????? 什么原因,请高手指点迷津!
...全文
27 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
danna 2002-08-17
  • 打赏
  • 举报
回复
下面是我在网上找到的一篇文章,也是讲只能保证一个实例正确运行的,我自已看不懂.不知看对你有帮助不?#include < IniFiles.hpp >
//增加代码
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
TIniFile *RunFlag=new TIniFile("MyTest.ini");
//增加代码
AnsiString RunCaption[2];   //增加代码
try
{
Application- >Initialize();
    //以下为增加代码
if(RunFlag->ReadInteger("Rec","RunFlag",0)==1)
{
RunCaption[0]=RunFlag- >ReadString("Rec","Caption","");
HWND PrevWindow=FindWindow
("TForm1",RunCaption[0].c_str());
if(PrevWindow)
{
ShowWindow(PrevWindow,SW_SHOW);
SetForegroundWindow(PrevWindow);
Application- >Terminate();
}
else
{
int button = Application- >MessageBox
("上次没有正常退出,要继续运行吗?",
"警告", MB_OKCANCEL);
if (button == IDCANCEL)
Application- >Terminate();
}
}
else
{ RunFlag- >WriteInteger("Rec","RunFlag",1);
RunFlag- >WriteString("Rec","Caption","Form1");
}
delete RunFlag;
  //上面的为增加代码
Application- >CreateForm(__classid(TForm1), &Form1);
Application- >Run();
}
catch (Exception &exception)
{ Application- >ShowException(&exception);}
return 0;
}

----
每个退出程序的地方必须加上以下处理代码,如Form的OnClose事件处理函数中、使用exit()函数前:
TIniFile *RunFlag=new TIniFile("MyTest.ini");
RunFlag- >WriteInteger("Rec","RunFlag",0);
RunFlag- >WriteString("Rec","Caption","");

每当标题变化时(如变为"欢迎光临")必须加上以下处理代码:

RunFlag- >WriteString("Rec","Caption","欢迎光临");

leeseon 2002-08-17
  • 打赏
  • 举报
回复
用ShowWindow(AppWnd,SW_SHOWNORMAL);是没有问题的。

我也遇到过这个问题,你可以去看下

http://www.csdn.net/expert/topic/870/870418.xml?temp=.2273981
xiaoguoru 2002-08-17
  • 打赏
  • 举报
回复
我觉得你将 ShowWindow(AppWnd,SW_RESTORE); SetForegroundWindow(AppWnd);改为 ShowWindow(AppWnd,SW_MINIMIZE);
ShowWindow(AppWnd,SW_SHOWNORMAL);试一下,我是这样解决的.
gfh21cn 2002-08-17
  • 打赏
  • 举报
回复
如果你自定义一个消息呢
用这个消息来让第一个实例自己处理

gfh21cn 2002-08-17
  • 打赏
  • 举报
回复
UP

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧