2020年7月20日月曜日

VB WPF お勉強 16 WPF でも管理者アイコン(盾マーク)を

自作プログラムで管理者アイコン 盾のマーク を付加するケースは限られています。
そんな特殊なものを書くのは稀ですから。
でも、昇格が必須のもの(ボタン / プロセス)を書いたら、例の 盾アイコン も必要ですし。
そして、Form での遣り方は WPF では通らない見たいですねぇ。


全般論として、
自分で書くプログラムで、管理者昇格が必須のものって、少ない筈です。
無論、プログラムそのものが全て管理者モードで!、等と言うものは、私には、無縁です。

ある条件下でのみ、管理者特権を行使する、
これは、稀ですが、無い訳ではありません。

当然、プロセスを Verb = runas で立ち上げるケースでは、
管理者昇格を明示する 盾アイコン Sheild Icon を付けるのが お決まり でしたね。

Form の時代には書いた事があったのですが、
WPF で、同じ様に書き進めると、壁に突き当たります。
別の書き方をしないと通らないのですね。

難儀しました。
備忘録的に書き残して置きましょう。

Sheild Icon が必要な WPF を書く方は、
それなりに、習得なさっている方だと思いますので、
コードの詳細には触れません。

基本的な事のみです。

xaml

Button に Shield Icon を表示する Control を定義
命名例は ImageShield で以下をお読み下さい。
( StackPanel 等を使用 )

Win32API を使って、Shield Icon データを取得

    'Imports System.Runtime.InteropServices

    Const SHGSI_ICON As UInt32 = &H100
    Const SHGSI_SMALLICON As UInt32 = &H1
    Const SIID_SHIELD As UInt32 = &H4D

    <StructLayoutAttribute(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
    Structure SHSTOCKICONINFO
        Public cbSize As Int32
        Public hIcon As IntPtr
        Public iSysImageIndex As Int32
        Public iIcon As Int32
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=260)>
        Public szPath As String
    End Structure

    <DllImport("shell32.dll", CharSet:=CharSet.Unicode)>
    Shared Sub SHGetStockIconInfo(ByVal siid As UInt32, ByVal uFlags As UInt32, ByRef sii As SHSTOCKICONINFO)
    End Sub

    Dim shieldSource As BitmapSource = Nothing

    Private Sub GetShield()
        'Dim shieldSource As BitmapSource = Nothing

        Dim sii As New SHSTOCKICONINFO()
        sii.cbSize = Marshal.SizeOf(sii)
        SHGetStockIconInfo(SIID_SHIELD, SHGSI_ICON Or SHGSI_SMALLICON, sii)
        If sii.hIcon <> IntPtr.Zero Then
            'Dim t = sii.hIcon
            shieldSource = Interop.Imaging.CreateBitmapSourceFromHIcon(sii.hIcon,
                                                                       Int32Rect.Empty,
                                                                       BitmapSizeOptions.FromEmptyOptions())
        End If

    End Sub

これに対して、 ImageShield.Source = shieldSource と割り当ててやれば OK !です
Control 例えば ImageShield の Visibility で ON / OFF を切り替えます。



0 件のコメント:

コメントを投稿