我想在后台进程中添加托盘图标。 顺便说一句,如果不是用户帐户(例如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;
答案 0 :(得分: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;
}
答案 1 :(得分:0)
这可能适用于XP,但是停止了在Vista上工作?
罪魁祸首相当容易。简单地说,每个帐户都有自己的桌面。 (从技术上讲,它是每个登录会话)。他们故意分开。
正常的解决方案是使用单独的命令和控制过程来提供整个UI。它在用户帐户下运行,因此可以在正确的桌面中显示UI。