加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 在WPF按钮旁边显示UAC Shield图标?

发布时间:2020-12-15 18:03:10 所属栏目:百科 来源:网络整理
导读:Microsoft要求按钮和列表条目旁边的UAC Shield图标将打开UAC验证提示.如何在 WPF按钮旁边显示此图标? 我已经在网上搜索了一个多小时,但是我无法找到将这个盾牌图标添加到WPF按钮的方法. 我有一个使用普通WPF按钮的WPF表单,但我能找到的大多数脚本都不适用于
Microsoft要求按钮和列表条目旁边的UAC Shield图标将打开UAC验证提示.如何在 WPF按钮旁边显示此图标?

我已经在网上搜索了一个多小时,但是我无法找到将这个盾牌图标添加到WPF按钮的方法.

我有一个使用普通WPF按钮的WPF表单,但我能找到的大多数脚本都不适用于我 – 主要是因为我的按钮没有FlatStyle或Handle属性(我认为WinForms-Buttons具有这些属性) )

我正在使用Visual Studio 2015社区和使用WPF的.NET Framework 3.5应用程序

我希望你们能帮助我.祝你今天愉快

解决方法

运行 Windows版本的实际 Windows图标是通过Win32 API提供的.我不知道.NET中的任何函数可以直接检索它,但是可以通过user32.dll上的p / invoke访问它.详细信息可以在 here找到.需要对WPF进行调整,因为链接代码适用于Winforms.

简短的摘要:

[DllImport("user32")]
public static extern UInt32 SendMessage
    (IntPtr hWnd,UInt32 msg,UInt32 wParam,UInt32 lParam);

internal const int BCM_FIRST = 0x1600; //Normal button
internal const int BCM_SETSHIELD = (BCM_FIRST + 0x000C); //Elevated button

static internal void AddShieldToButton(Button b)
{
    b.FlatStyle = FlatStyle.System;
    SendMessage(b.Handle,BCM_SETSHIELD,0xFFFFFFFF);
}

更新

This将允许您直接访问正确的图标,它可以直接在WPF中使用.

BitmapSource shieldSource = null;

if (Environment.OSVersion.Version.Major >= 6)
{
    SHSTOCKICONINFO sii = new SHSTOCKICONINFO();
    sii.cbSize = (UInt32) Marshal.SizeOf(typeof(SHSTOCKICONINFO));

    Marshal.ThrowExceptionForHR(SHGetStockIconInfo(SHSTOCKICONID.SIID_SHIELD,SHGSI.SHGSI_ICON | SHGSI.SHGSI_SMALLICON,ref sii));

    shieldSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHIcon(
        sii.hIcon,Int32Rect.Empty,BitmapSizeOptions.FromEmptyOptions());

    DestroyIcon(sii.hIcon);
}
else
{
    shieldSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHIcon(
        System.Drawing.SystemIcons.Shield.Handle,BitmapSizeOptions.FromEmptyOptions());
}

p / Invoke签名可以在here找到.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读