我有 WPF桌面应用程序正在推送一些通知使用:

NotifyIcon.ShowBalloonTip(,ToolTipIcon.None).

问题是:

Windows 10使用新的“带图像和文本的Windows 10矩形”样式进行气球通知(我不知道它是如何调用的).

如果我使用ToolTipIcon.None参数,它会获取我的应用程序图标,该图标设置为NotifyIcon.Icon属性并在此气球通知中显示.并且这个图标被模糊/拉伸(就像拍摄太小的图标并拉伸到这个气球图像所需的尺寸).

我的ico文件包含几种尺寸:16 * 16,32 * 32,128 * 128,256 * 256等.我已经尝试设置只有一个128 * 128大小的图标文件,但它不起作用.

应该可以吗?

谢谢.

下面的类应该在Windows 10的气球提示中显示一个平滑的大图标.它绝不是完美的,但它应该证明这个概念.很大一部分代码直接从反编译的Microsoft NotifyIcon类中复制.

原始NotifyIcon类与此之间的关键更改是:

>添加(和使用)NOTIFYICONDATA.hBalloonIcon成员.
> nOTIFYICONDATA.dwInfoFlags = NIIF_LARGE_ICON |的设置NIIF_USER,而不是NIIF_NONE.

您可以阅读NOTIFYICONDATA结构here的具体内容,但要点是:

>在Vista中添加了hBalloonIcon,专门用于系统托盘外部.
> NIIF_USER说要使用hBalloonIcon中的图标作为气球图标.
> NIIF_LARGE_ICON说气球的图标应该很大.

NotifyIconLarge类:

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace BalloonNotification
{
    public class NotifyIconLarge : Idisposable
    {
        [DllImport("shell32.dll",CharSet = CharSet.Auto)]
        public static extern int Shell_NotifyIcon(int message,NOTIFYICONDATA pnid);

        [DllImport("Comctl32.dll",CharSet = CharSet.Unicode)]
        private static extern IntPtr LoadIconWithScaleDown(IntPtr hinst,string pszName,int cx,int cy,out IntPtr phico);

        [DllImport("user32.dll",SetLastError = true)]
        static extern bool DestroyIcon(IntPtr hIcon);

        private const int NIIF_LARGE_ICON = 0x00000020;
        private const int NIIF_USER = 0x00000004;

        [StructLayout(LayoutKind.Sequential,CharSet = CharSet.Auto)]
        public class NOTIFYICONDATA
        {
            public int cbSize = Marshal.SizeOf(typeof(NOTIFYICONDATA));
            public IntPtr hWnd;
            public int uID;
            public int uFlags;
            public int uCallbackMessage;
            public IntPtr hIcon;
            [MarshalAs(UnmanagedType.ByValTStr,SizeConst = 128)]
            public string szTip;
            public int dwState;
            public int dwStateMask;
            [MarshalAs(UnmanagedType.ByValTStr,SizeConst = 256)]
            public string szInfo;
            public int uTimeoutOrVersion;
            [MarshalAs(UnmanagedType.ByValTStr,SizeConst = 64)]
            public string szInfoTitle;
            public int dwInfoFlags;
            Guid guidItem;
            public IntPtr hBalloonIcon;
        }

        private IntPtr _windowHandle;
        private IntPtr _hIcon;
        private bool _added;
        private int _id = 1;
        private string _tipText;

        public NotifyIconLarge(IntPtr windowHandle,string iconFile,int iconSize,string tipText)
        {
            _windowHandle = windowHandle;
            _tipText = tipText;
            IntPtr result = LoadIconWithScaleDown(IntPtr.Zero,iconFile,iconSize,out _hIcon);
            UpdateIcon(true);
        }

        private void UpdateIcon(bool showIconInTray)
        {
            NOTIFYICONDATA nOTIFYICONDATA = new NOTIFYICONDATA();
            nOTIFYICONDATA.uCallbackMessage = 2048;
            nOTIFYICONDATA.uFlags = 1;
            nOTIFYICONDATA.hWnd = _windowHandle;
            nOTIFYICONDATA.uID = _id;
            nOTIFYICONDATA.hIcon = IntPtr.Zero;
            nOTIFYICONDATA.szTip = null;
            if (_hIcon != IntPtr.Zero)
            {
                nOTIFYICONDATA.uFlags |= 2;
                nOTIFYICONDATA.hIcon = _hIcon;
            }
            nOTIFYICONDATA.uFlags |= 4;
            nOTIFYICONDATA.szTip = _tipText;
            nOTIFYICONDATA.hBalloonIcon = _hIcon;
            if (showIconInTray && _hIcon != IntPtr.Zero)
            {
                if (!_added)
                {
                    Shell_NotifyIcon(0,nOTIFYICONDATA);
                    _added = true;
                }
                else
                {
                    Shell_NotifyIcon(1,nOTIFYICONDATA);
                }
            }
            else
            {
                if (_added)
                {
                    Shell_NotifyIcon(2,nOTIFYICONDATA);
                    _added = false;
                }
            }
        }

        public void ShowBalloonTip(int timeout,string tipTitle,string tipText,ToolTipIcon tipIcon)
        {
            NOTIFYICONDATA nOTIFYICONDATA = new NOTIFYICONDATA();
            nOTIFYICONDATA.hWnd = _windowHandle;
            nOTIFYICONDATA.uID = _id;
            nOTIFYICONDATA.uFlags = 16;
            nOTIFYICONDATA.uTimeoutOrVersion = timeout;
            nOTIFYICONDATA.szInfoTitle = tipTitle;
            nOTIFYICONDATA.szInfo = tipText;
            switch (tipIcon)
            {
                case ToolTipIcon.None:
                    nOTIFYICONDATA.dwInfoFlags = NIIF_LARGE_ICON | NIIF_USER;
                    break;
                case ToolTipIcon.Info:
                    nOTIFYICONDATA.dwInfoFlags = 1;
                    break;
                case ToolTipIcon.Warning:
                    nOTIFYICONDATA.dwInfoFlags = 2;
                    break;
                case ToolTipIcon.Error:
                    nOTIFYICONDATA.dwInfoFlags = 3;
                    break;
            }
            int ret = Shell_NotifyIcon(1,nOTIFYICONDATA);
        }

        public void RemoveFromTray()
        {
            UpdateIcon(false);
            if (_hIcon != IntPtr.Zero)
                DestroyIcon(_hIcon);
        }

        ~NotifyIconLarge()
        {
            dispose(false);
        }

        public void dispose()
        {
            dispose(true);
            GC.SuppressFinalize(this);
        }

        public void dispose(bool disposing)
        {
            RemoveFromTray();
        }
    }
}

在某处声明它:

private NotifyIconLarge _nil;

然后像这样使用它:

string fileName = @"C:\path_to_some_icon.ico";
_nil = new NotifyIconLarge(Handle,fileName,64,"Icon Tip");
_nil.ShowBalloonTip(10000,"Balloon Title","Balloon Text",ToolTipIcon.None);

完成后,删除托盘图标:

_nil.RemoveFromTray();

如何显示气球提示像Windows 10气球提示没有拉伸图标的更多相关文章

  1. 确定字符串是否包含Swift中的一个字符的最佳方法是什么?

    我需要确定字符串是否包含我定义的自定义集中的任何字符.我从this发现你可以使用rangeOfString来确定一个字符串是否包含另一个字符串.这当然也适用于字符,如果你一次测试每个字符一个.我想知道最好的办法是做什么.您可以创建一个包含自定义字符集的CharacterSet然后根据此字符集测试成员资格:Swift3:对于不区分大小写的比较,请使用.Swift2:Swift1.2

  2. android – 使用改造下载图像文件

    解决方法问题是响应中的内容类型标头包含一个虚假的字符集:Retrofit看到了这一点,并推断响应是它可以记录的文本.您应该将问题报告给服务器的管理员.如果您将问题报告给GitHub上的Retrofit问题跟踪器,我们可能会从此问题中恢复而不是崩溃.

  3. android – 如何知道标签是否存在?

    我认为有必要插入一个按钮来检查标签是否存在.我在我的活动中添加了“前台调度系统”,但是我仍然不明白如果标签存在与否,如何显示消息,在使用读写方法之前要检查什么?解决方法扫描新的NFC标签后立即调用onNewIntent.例如,如果您想要写入每个扫描的标记,则onNewIntent()方法将如下所示:你的writeTag方法当然还没有使用它给出的字符串,但你可能知道.如果您想要保持最新的布尔值以检查可用标记,请执行以下操作:

  4. Android:java.net.protocolException不支持输出

    我用错了吗?

  5. script标签的 charset 属性使用说明

    如果外部文件中的字符编码与主文件中的编码方式不同,就要用到 charset 属性。

  6. 如何显示气球提示像Windows 10气球提示没有拉伸图标

    我有WPF桌面应用程序正在推送一些通知使用:NotifyIcon.ShowBalloonTip(,ToolTipIcon.None).问题是:Windows10使用新的“带图像和文本的Windows10矩形”样式进行气球通知(我不知道它是如何调用的).如果我使用ToolTipIcon.None参数,它会获取我的应用程序图标,该图标设置为NotifyIcon.Icon属性并在此气球通知中显示.并且这

  7. 如何在Windows上用Java创建 – 然后 – 原子重命名文件?

    我正在尝试在Windows上使用Java正确实现“写临时文件并重命名”.HowtoatomicallyrenameafileinJava,evenifthedestfilealreadyexists?建议重命名文件是“原子操作”(无论“原子”实际上是什么意思).https://stackoverflow.com/a/20570968/65458建议编写tmp文件并重命名是跨平台的,并确保最终文件不

  8. Windows – 如何编程检查“密码必须满足复杂性要求”组策略设置?

    窗口有五个与密码安全相关的策略设置:>强制密码历史记录>最大密码年龄>最小密码年龄>最小密码长度>密码必须满足复杂性要求>使用可逆加密存储密码我知道如何使用NetUserModalsGet读取mostoftheseitems.但它不支持检查密码复杂性要求是否启用:>强制密码历史记录:usrmod0_password_hist_len>最大密码年龄:usrmod0_max_passwd_age>最小

  9. 在Windows Vista / 7的C#中显示验证对话框

    我还需要能够获得输入的凭据.我设法实施一个为我工作的解决方案.这是源代码:我仍然需要找出精细的细节,例如如何记住输入的最后一个凭据等…

  10. PHP输出JSON Web Service charset UTF-8错误

    我正在通过PHP托管JSON输出的Web服务.我在DB中有希伯来语数据集,我将此作为输出发布到Web服务.当我最初发布数据时,它输出结果如下:JSON:但是这个“×הרר“可以被Android/Iphone解析器读取并将其转换为原始的希伯来语.但我在“名字”中遇到错误:“×ר×ר××”××–××××’××××גדה,其中“位于字符串之间,因此JSON无效并显示错误!为了解决这个问题

随机推荐

  1. static – 在页面之间共享数据的最佳实践

    我想知道在UWP的页面之间发送像’selectedItem’等变量的最佳做法是什么?创建一个每个页面都知道的静态全局变量类是一个好主意吗?

  2. .net – 为Windows窗体控件提供百分比宽度/高度

    WindowsForm开发的新手,但在Web开发方面经验丰富.有没有办法为Windows窗体控件指定百分比宽度/高度,以便在用户调整窗口大小时扩展/缩小?当窗口调整大小时,可以编写代码来改变控件的宽度/高度,但我希望有更好的方法,比如在HTML/CSS中.在那儿?

  3. 使用Windows Azure查询表存储数据

    我需要使用特定帐户吗?>将应用程序部署到Azure服务后,如何查询数据?GoogleAppEngine有一个数据查看器/查询工具,Azure有类似的东西吗?>您可以看到的sqlExpressintance仅在开发结构中,并且一旦您表示没有等效,所以请小心使用它.>您可以尝试使用Linqpad查询表格.看看JamieThomson的thispost.

  4. windows – SetupDiGetClassDevs是否与文档中的设备实例ID一起使用?

    有没有更好的方法可以使用DBT_DEVICEARRIVAL事件中的数据获取设备的更多信息?您似乎必须指定DIGCF_ALLCLASSES标志以查找与给定设备实例ID匹配的所有类,或者指定ClassGuid并使用DIGCF_DEFAULT标志.这对我有用:带输出:

  5. Windows Live ID是OpenID提供商吗?

    不,WindowsLiveID不是OpenID提供商.他们使用专有协议.自从他们的“测试版”期结束以来,他们从未宣布计划继续它.

  6. 如果我在代码中进行了更改,是否需要重新安装Windows服务?

    我写了一个Windows服务并安装它.现在我对代码进行了一些更改并重新构建了解决方案.我还应该重新安装服务吗?不,只需停止它,替换文件,然后重新启动它.

  7. 带有双引号的字符串回显使用Windows批处理输出文件

    我正在尝试使用Windows批处理文件重写配置文件.我循环遍历文件的行并查找我想要用指定的新行替换的行.我有一个’函数’将行写入文件问题是%Text%是一个嵌入双引号的字符串.然后失败了.可能还有其他角色也会导致失败.如何才能使用配置文件中的所有文本?尝试将所有“在文本中替换为^”.^是转义字符,因此“将被视为常规字符你可以尝试以下方法:其他可能导致错误的字符是:

  8. .net – 将控制台应用程序转换为服务?

    我正在寻找不同的优势/劣势,将我们长期使用的控制台应用程序转换为Windows服务.我们为ActiveMQ使用了一个叫做java服务包装器的东西,我相信人们告诉我你可以用它包装任何东西.这并不是说你应该用它包装任何东西;我们遇到了这个问题.控制台应用程序是一个.NET控制台应用程序,默认情况下会将大量信息记录到控制台,尽管这是可配置的.任何推荐?我们应该在VisualStudio中将其重建为服务吗?我使用“-install”/“-uninstall”开关执行此操作.例如,seehere.

  9. windows – 捕获外部程序的STDOUT和STDERR *同时*它正在执行(Ruby)

    哦,我在Windows上:-(实际上,它比我想象的要简单,这看起来很完美:…是的,它适用于Windows!

  10. windows – 当我试图批量打印变量时,为什么我得到“Echo is on”

    我想要执行一个简单的批处理文件脚本:当我在XP中运行时,它给了我预期的输出,但是当我在Vista或Windows7中运行它时,我在尝试打印值时得到“EchoisOn”.以下是程序的输出:摆脱集合表达式中的空格.等号(=)的两侧可以并且应该没有空格BTW:我通常在@echo关闭的情况下启动所有批处理文件,并以@echo结束它们,所以我可以避免将代码与批处理文件的输出混合.它只是使您的批处理文件输出更好,更清洁.

返回
顶部