0

我想在后台进程上添加托盘图标。顺便说一句,如果不是用户帐户(例如 SYSTEM)来运行程序,则不要添加托盘图标。如果使用我的帐户,它可以工作。如何通过非用户帐户添加托盘图标来运行程序?

NOTIFYICONDATA nid;

ZeroMemory(&nid, sizeof(NOTIFYICONDATA));
nid.cbSize = sizeof(NOTIFYICONDATA);
nid.hWnd = hWnd;
nid.uFlags =  NIF_INFO|NIF_ICON|NIF_TIP; 

    sprintf(nid.szInfoTitle, "title"); 
    sprintf(nid.szInfo, "infomation"); 
    sprintf(nid.szTip, "tip");

nid.dwInfoFlags = NIIF_INFO;

if(g_UpdaterInfo.osver == cWinXP)
{
    nid.uTimeout = 3000;
}

nid.uID = IDI_ICON;
    nid.hIcon = LoadIcon(_AtlBaseModule.GetModuleInstance(), MAKEINTRESOURCE(IDI_ICON));

BOOL add = Shell_NotifyIcon(NIM_ADD, &nid);
DWORD result = GetLastError();
CString msg;
msg.Format("Tray AddIcon: %d", result);
FileLog(LOG_FILE, msg);
if(!add)
    return FALSE;

return TRUE;
4

2 回答 2

0

添加托盘图标很简单:

#include "stdafx.h"
#include <Windows.h>
#include "resource.h"


int _tmain(int argc, _TCHAR* argv[])
{
    NOTIFYICONDATA nid;

    ZeroMemory(&nid, sizeof(NOTIFYICONDATA));
    nid.cbSize = sizeof(NOTIFYICONDATA);
    nid.hWnd = NULL;//hWnd;
    nid.uFlags =  NIF_INFO|NIF_ICON|NIF_TIP; 

    sprintf_s(nid.szInfoTitle, "title"); 
    sprintf_s(nid.szInfo, "infomation"); 
    sprintf_s(nid.szTip, "tip");

    nid.dwInfoFlags = NIIF_INFO;

    //if(g_UpdaterInfo.osver == cWinXP)
    //{
    //    nid.uTimeout = 3000;
    //}
    nid.uTimeout = 3000;

    nid.uID = IDI_ICON1;
    nid.hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICON1));

    BOOL add = Shell_NotifyIcon(NIM_ADD, &nid);
    //DWORD result = GetLastError();
    //CString msg;
    //msg.Format("Tray AddIcon: %d", result);
    //FileLog(LOG_FILE, msg);
    if(!add)
        return FALSE;

    return TRUE;
}
于 2013-06-17T08:56:41.600 回答
0

这可能在 XP 上有效,但在 Vista 上停止工作?

罪魁祸首相当容易。简单地说,每个帐户都有自己的桌面。(从技术上讲,它是每个登录会话)。他们是故意分开的。

正常的解决方案是有一个单独的命令和控制过程来提供整个 UI。它在用户帐户下运行,因此可以在正确的桌面上显示 UI。

于 2013-06-17T09:26:19.307 回答