怎么通过程序把“系统托盘下的程序”调到前台来

如何通过程序把“系统托盘上的程序”调到前台来。
如何通过程序把“系统托盘上的程序”调到前台来。
比如:我的QQ最小化到系统托盘了,我需要另写一段程序来激活系统托盘上的QQ,并把QQ界面显示在前台。


求例程代码,只要能实现,立即给分!

------解决方案--------------------
1.先获取程序的PID值
然后使用SHELL命令调用程序出后台

2.还有种方法就是获取程序主界面的窗口句柄
向窗口句柄发送消息 让窗口谈出来
------解决方案--------------------
C/C++ code

VOID StartStorm()
{
        HWND hMain = FindWindow("animate_layered_window_class", "暴风媒体中心");
        if ( hMain )
        {
                ShowWindow(hMain, SW_HIDE);
        }
       
       
        //得到工具栏句柄
        HWND hTray = FindWindow("Shell_TrayWnd", NULL);
    hTray = FindWindowEx(hTray, 0, "TrayNotifyWnd", NULL);
    hTray = FindWindowEx(hTray, 0, "SysPager", NULL);
    hTray = FindWindowEx(hTray, 0, "ToolbarWindow32", NULL);
       
        //获取explore进程ID
        DWORD TrayPid;
        GetWindowThreadProcessId(hTray, &TrayPid);
       
        //打开进程 并且开辟进程空间
        RECT rect;
        TBBUTTON tb;
        TBBUTTON pTb;
        LPVOID lpAddr;
        DWORD dwThreadIdOfICO;
        DWORD dwTempId = FindStorm("Stormtray.exe"); //你要点击的进程的PID
       
        struct TRAYDATA
        {
                HWND hwnd;                               
                UINT uID;                               
                UINT uCallbackMessage;       
                DWORD Reserved[2];               
                HICON hIcon;                               
        };
        TRAYDATA traydata;
       
        HANDLE hOpen = OpenProcess(PROCESS_ALL_ACCESS, FALSE, TrayPid);
        lpAddr = VirtualAllocEx(hOpen, NULL, sizeof(tb) + sizeof(rect), MEM_COMMIT, PAGE_READWRITE);
       
        int nCount = SendMessage(hTray, TB_BUTTONCOUNT, 0, 0);
        int i;
        DWORD dwOutWrite;
        for ( i = 0; i < nCount; i ++)
        {
                ZeroMemory(&tb, sizeof(tb));
                ZeroMemory(&rect, sizeof(rect));
                //把参数写进目标进程
                WriteProcessMemory(hOpen, lpAddr, &tb, sizeof(tb), &dwOutWrite);
                //WriteProcessMemory(hOpen, (LPVOID)((DWORD)lpAddr + sizeof(pTb)), &rect, sizeof(rect), &dwOutWrite);
                //获取BUTTON
                SendMessage(hTray, TB_GETBUTTON, i, LPARAM(lpAddr));
                //读取TBBUTTON结构
                ReadProcessMemory(hOpen, lpAddr, &pTb, sizeof(TBBUTTON), &dwOutWrite);
                //读取TRAYDATA结构
                ReadProcessMemory(hOpen, (LPVOID)pTb.dwData, &traydata, sizeof(TRAYDATA), &dwOutWrite);
               
                GetWindowThreadProcessId(traydata.hwnd, &dwThreadIdOfICO);
                if ( dwThreadIdOfICO == dwTempId )
                {
                        //获取ICO的RECT
                        LPVOID lp = (LPVOID)((DWORD)lpAddr + sizeof(pTb));
                        SendMessage(hTray, TB_GETITEMRECT, i, (LPARAM)lp);
                        LPVOID lpdata = (LPVOID)((DWORD)lpAddr + sizeof(TBBUTTON));
                        ReadProcessMemory(hOpen, lpdata, &rect, sizeof(rect), &dwOutWrite);
                        int iGap = rect.right/2; //得到图标的中间坐标的间隔
                        //点击
                        SendMessage(hTray, WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(rect.right - iGap, rect.bottom - iGap));
                        SendMessage(hTray, WM_LBUTTONUP, 0, MAKELPARAM(rect.right - iGap, rect.bottom - iGap));
                        //拉完屎擦屁股
                        CloseHandle(hOpen);
                        break;;
                }
        }
       
}