高分贴,如何把,在程序运行并最小化成托盘图标后,再次双击该程序,使原来的最小化程序激活,并在窗口最前方

[复制链接]
查看11 | 回复8 | 2021-1-27 07:04:30 | 显示全部楼层 |阅读模式
高分贴,
如何把,在程序运行并最小化成托盘图标后,再次双击该程序,使原来的最小化程序激活,并在窗口最前方,注意,是再次点运行程序的图标,不是托盘图标,是再次点运行程序的图标,不是托盘图标。谢谢!
分 -->
回复

使用道具 举报

千问 | 2021-1-27 07:04:30 | 显示全部楼层
你用delphi几
回复

使用道具 举报

千问 | 2021-1-27 07:04:30 | 显示全部楼层
d7的示例,用了TTrayIcon
http://pan.baidu.com/share/link?shareid=3394217811&uk=1124482001

回复

使用道具 举报

千问 | 2021-1-27 07:04:30 | 显示全部楼层
是再次点运行程序的图标?啥意思?发个图上来看看
回复

使用道具 举报

千问 | 2021-1-27 07:04:30 | 显示全部楼层
这不就是只启动一个实例吗,程序启动的时候检测某种标志,比如一个semaphore,如果有的话就说明之前启动过了,那就用某种方法,比如发送用户消息,通知前一实例激活,然后自己退出。

回复

使用道具 举报

千问 | 2021-1-27 07:04:30 | 显示全部楼层



回复

使用道具 举报

千问 | 2021-1-27 07:04:30 | 显示全部楼层
从网上转过来的,没有试过,你可以参考一下:
unitMultInst;
interface
uses
Windows,Messages,SysUtils,Classes,Forms;
implementation
const
STR_UNIQUE='{2BE6D96E-827F-4BF9-B33E-8740412CDE96}';
MI_ACTIVEAPP=1;//激活应用程序
MI_GETHANDLE=2;//取得句柄
var
iMessageID:Integer;
OldWProc:TFNWndProc;
MutHandle:THandle;
BSMRecipients:DWORD;
functionNewWndProc(Handle:HWND;Msg:Integer;wParam,lParam:Longint):
Longint;stdcall;
begin
Result:=0;
ifMsg=iMessageIDthen
begin
casewParamof
MI_ACTIVEAPP://激活应用程序
iflParam0then
begin
//收到消息的激活前一个实例
//为什么要在另一个程序中激活?
//因为在同一个进程中SetForegroundWindow并不能把窗体提到最前
ifIsIconic(lParam)then
OpenIcon(lParam)
else
SetForegroundWindow(lParam);
//终止本实例
Application.Terminate;
end;
MI_GETHANDLE://取得程序句柄
begin
PostMessage(HWND(lParam),iMessageID,MI_ACTIVEAPP,
Application.Handle);
end;
end;
end
else
Result:=CallWindowProc(OldWProc,Handle,Msg,wParam,lParam);
end;
procedureInitInstance;
begin
//取代应用程序的消息处理
OldWProc:=TFNWndProc(SetWindowLong(Application.Handle,GWL_WNDPROC,
Longint(@NewWndProc)));
//打开互斥对象
MutHandle:=OpenMutex(MUTEX_ALL_ACCESS,False,STR_UNIQUE);
ifMutHandle=0then
begin
//建立互斥对象
MutHandle:=CreateMutex(nil,False,STR_UNIQUE);
end
elsebegin
Application.ShowMainForm:=False;
//已经有程序实例,广播消息取得实例句柄
BSMRecipients:=BSM_APPLICATIONS;
BroadCastSystemMessage(BSF_IGNORECURRENTTASKorBSF_POSTMESSAGE,
@BSMRecipients,iMessageID,MI_GETHANDLE,Application.Handle);
end;
end;
initialization
//注册消息
iMessageID:=RegisterWindowMessage(STR_UNIQUE);
InitInstance;
finalization
//还原消息处理过程
ifOldWProcNilthen
SetWindowLong(Application.Handle,GWL_WNDPROC,LongInt(OldWProc));
//关闭互斥对象
ifMutHandle0thenCloseHandle(MutHandle);
end.

回复

使用道具 举报

千问 | 2021-1-27 07:04:30 | 显示全部楼层
楼主照我说的试试,一个比较简单的例子,使用cooltrayicon。在主界面中添加此控件,然后在主界面的onclose事件里写入action=canone即可。
XE之后的高版本,在执行onclose的时候,直接有caminisize、cahide可供设置。
回复

使用道具 举报

千问 | 2021-1-27 07:04:30 | 显示全部楼层
没看清楚。。。抱歉我有个例子,明天再发吧,已经在被窝了,呵呵
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行