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

解决方案 »

  1.   

    你用delphi几
      

  2.   

    d7的示例,用了TTrayIcon
    http://pan.baidu.com/share/link?shareid=3394217811&uk=1124482001
      

  3.   

    这不就是只启动一个实例吗,程序启动的时候检测某种标志,比如一个semaphore,如果有的话就说明之前启动过了,那就用某种方法,比如发送用户消息,通知前一实例激活,然后自己退出。
      

  4.   

    从网上转过来的,没有试过,你可以参考一下:
    unit MultInst;interfaceuses
    Windows ,Messages, SysUtils, Classes, Forms;implementationconst
    STR_UNIQUE = '{2BE6D96E-827F-4BF9-B33E-8740412CDE96}';
    MI_ACTIVEAPP = 1; //激活应用程序
    MI_GETHANDLE = 2; //取得句柄var
    iMessageID : Integer;
    OldWProc : TFNWndProc;
    MutHandle : THandle;
    BSMRecipients : DWORD;function NewWndProc(Handle: HWND; Msg: Integer; wParam, lParam: Longint):
    Longint; stdcall;
    begin
    Result := 0;
    if Msg = iMessageID then
    begin
    case wParam of
    MI_ACTIVEAPP: //激活应用程序
    if lParam<>0 then
    begin
    //收到消息的激活前一个实例
    //为什么要在另一个程序中激活?
    //因为在同一个进程中SetForegroundWindow并不能把窗体提到最前
    if IsIconic(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;procedure InitInstance;
    begin
    //取代应用程序的消息处理
    OldWProc := TFNWndProc(SetWindowLong(Application.Handle, GWL_WNDPROC,
    Longint(@NewWndProc)));//打开互斥对象
    MutHandle := OpenMutex(MUTEX_ALL_ACCESS, False, STR_UNIQUE);
    if MutHandle = 0 then
    begin
    //建立互斥对象
    MutHandle := CreateMutex(nil, False, STR_UNIQUE);
    end
    else begin
    Application.ShowMainForm := False;
    //已经有程序实例,广播消息取得实例句柄
    BSMRecipients := BSM_APPLICATIONS;
    BroadCastSystemMessage(BSF_IGNORECURRENTTASK or BSF_POSTMESSAGE,
    @BSMRecipients, iMessageID, MI_GETHANDLE,Application.Handle);
    end;
    end;initialization
    //注册消息
    iMessageID := RegisterWindowMessage(STR_UNIQUE);
    InitInstance;finalization
    //还原消息处理过程
    if OldWProc <> Nil then
    SetWindowLong(Application.Handle, GWL_WNDPROC, LongInt(OldWProc));//关闭互斥对象
    if MutHandle <> 0 then CloseHandle(MutHandle);end.
      

  5.   

    楼主照我说的试试,一个比较简单的例子,使用cooltrayicon。在主界面中添加此控件,然后在主界面的onclose事件里写入action=canone即可。
    XE之后的高版本,在执行onclose的时候,直接有caminisize、cahide可供设置。