3

TaskDialog メッセージ ボックスにセキュリティ成功アイコン (青色の背景) を表示しようとしています。これは、TaskDialogStandardIcon の列挙値の 1 つではありません。参照: http://dotnet.dzone.com/articles/using-new-taskdialog-winapi

これらの非標準値を ((TaskDialog)sender).Icon に割り当てるにはどうすればよいですか? C#でも可能ですか?C#

どんな指針も本当に役に立ちます。

よろしく、アシュウィン

4

3 に答える 3

5

TaskDialog自分から関数をインポートする必要があると思いますcomctl32.dll

static class TaskDialogWrapper
{
    [DllImport("comctl32.dll", CharSet = CharSet.Unicode, EntryPoint = "TaskDialog")]
    static extern int TaskDialog(IntPtr hWnd, IntPtr hInstance, string pszWindowTitle, string pszMainInstruction, string pszContent, TaskDialogCommonButton dwCommonButtons, IntPtr pszIcon, out IntPtr pnButton);

    public static TaskDialogCommonButton Show(IntPtr handle, IntPtr instance, string title, string instructionText, string content, TaskDialogCommonButton commonButtons, TaskDialogCommonIcon commonIcon)
    {
        IntPtr resultButton;
        if (TaskDialog(handle, instance, title, instructionText, content, commonButtons, new IntPtr((int)commonIcon), out resultButton) != 0)
            throw new InvalidOperationException();
        return (TaskDialogCommonButton)resultButton;
    }
}

[Flags()]
enum TaskDialogCommonButton
{
    Ok = 0x1,
    Yes = 0x2,
    No = 0x4,
    Cancel = 0x8,
    Retry = 0x10,
    Close = 0x20
}

enum TaskDialogCommonIcon
{
    ShieldGrey = 65527,
    ShieldOk = 65528,
    ShieldError = 65529,
    ShieldWarning = 65530,
    ShieldBlue = 65531,
    Shield = 65532,
    Information = 65533,
    Error = 65534,
    Warning = 65535,
}

ファイルから独自のアイコンを使用するには、インポートする必要がありますTaskDialogIndirect


(ちなみに、私は他にも多くの興味深いアイコン スタイルを見つけましたTaskDialogCommonIcon。たとえば、次のように追加できます。

enum TaskDialogCommonIcon
{
    None = 0,
    Sheet = 2,
    ExplorerFolderOpen = 3,
    ExplorerFolderFlat = 5,
    ExplorerFolderLeft = 6,
    Search = 8,
    ExplorerFolderClosed = 10,
    ExplorerGames = 14,
    Application = 15,
    TransparentSpace = 17,
    ExplorerSearch = 18,
    TextFile = 19,
    Letter = 20,
    Picture = 21,
    Diashow = 103,
    // ...
}
于 2016-09-01T06:54:58.830 に答える
3

これは古い質問であることは知っていますが、似たようなものを探していたので、見つけたものを伝えたいと思いました。@KnorxThieus によって投稿された情報を使用して、上記の DLLImport プロセスを実行せずに、TaskDialog で「非表示の」セキュリティ アイコンを使用する方法を見つけました。彼が列挙のために提供した実際の値を使用して、それらを適切な型 (つまり) にキャストするだけで、アプリケーションで適切に表示TaskDialogCommonIconできることがわかりました。TaskDialogCommonIcon

Nuget (nuget.org/packages/WindowsAPICodePack-Core) の WindowsAPICodePack バージョン 1.1.2 を使用していることに注意してください。以下のコードは、Telerik コード コンバーター ( http://converter.telerik ) を使用して Visual Basic から変換されています。 .com/ ) であるため、C# で微調整が必​​要になる場合があります。

if (TaskDialog.IsPlatformSupported) {
    using (TaskDialog dialog = new TaskDialog()) {
        dialog.Caption = "TESTING";
        dialog.InstructionText = "THIS IS A TEST";
        dialog.Text = "This is a test of casting a value to the desired Icon type for a TaskDialog.";

        // Produces the green shield with green background
        dialog.Icon = (TaskDialogStandardIcon)65528;
        dialog.OwnerWindowHandle = this.Handle;
        dialog.Show();
    }
}

私のテストでは、これは@KnorxThieusがリストしたすべての列挙と他のいくつかの列挙で機能するようです。Iconプロパティを別の(非標準)画像ファイルに設定するための同様の方法があるかどうかを調べようとしていますが、これまでのところ成功していません。これが、将来これに出くわした人に役立つことを願っています。

于 2016-11-28T23:03:58.587 に答える